v1.19.5
系统: CentOS7.9
环境
一个master节点,两个node节点。
cpu最少2个, 不然kubeadm会报错, 内存最少2G。
关闭防火墙:
systemctl stop firewalld
systemctl disable firewalld
关闭selinux:
sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config
关闭swap:
kubelet不支持swap开启的情况, 而且在kubeadm init阶段也会报错退出。
swapoff -a
# 修改/etc/fstab关闭swap分区。
bridge-nf-call-iptables
一些 RHEL/CentOS 7 的用户曾经遇到过问题:由于 iptables 被绕过而导致流量无法正确路由的问题。您应该确保 在 sysctl 配置中的 net.bridge.bridge-nf-call-iptables 被设置为 1。
cat </etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system
确保在此步骤之前已加载了 br_netfilter 模块。这可以通过运行 lsmod | grep br_netfilter 来完成。要显示加载它,请调用 modprobe br_netfilter。
modprobe br_netfilter
cat <<EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system
旧版的docker在docker info的时候会报这个错误, 不过新版的已经自动添加这两个参数了。
其它
- 时间同步
- 主节点需要有其它节点的解析。
在执行kubectl的logs,exec之类的命令时需要连接节点。
安装docker
所有节点
安装
https://docs.docker.com/engine/install/centos/
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
yum install docker-ce docker-ce-cli containerd.io -y
配置
镜像加速,存储驱动,cgroup驱动.
mkdir -p /etc/docker
cat > /etc/docker/daemon.json << EOF
{"registry-mirrors": ["https://3oegfh0i.mirror.aliyuncs.com"],
"storage-driver": "overlay2",
"exec-opts": ["native.cgroupdriver=systemd"]
}
EOF
启动
systemctl start docker
systemctl enable docker
安装kubeadm与相关
所有节点
https://kubernetes.io/zh/docs/setup/production-environment/tools/kubeadm/install-kubeadm/
安装
使用阿里云的仓库
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
安装指定版本软件
yum install -y kubelet-1.19.5 kubeadm-1.19.5 kubectl-1.19.5
systemctl enable kubelet
配置cgroup
配置kubelet使用的cgroup驱动。
在使用docker时,kubeadm会自动检测docker使用的cgroup驱动, 其它的CRI需要手动修改配置文件:
/etc/sysconfig/kubelet
CentOS系
/etc/default/kubelet
Ubuntu系
配置文件里可以添加额外的kubelet参数。
这里还是手动添加一下配置,不添加也没事。
KUBELET_EXTRA_ARGS=--cgroup-driver=systemd
暂时不需要启动kubelet, 初始化的时候会自动启动。
初始化master节点
master节点
https://kubernetes.io/zh/docs/reference/setup-tools/kubeadm/kubeadm-init/
kubeadm init \
--apiserver-advertise-address=192.168.1.241 \
--image-repository=registry.aliyuncs.com/google_containers \
--kubernetes-version=v1.19.5 \
--pod-network-cidr=10.0.0.0/16 \
--service-cidr=10.1.0.0/16
分别是apiserver对外的地址,
镜像仓库,下载组件镜像。
k8s的版本,要跟之前安装的kubelet版本一样,kubelet --version
看一下。
为pod分配地址的范围。
为service分配地址的范围。
这里提示已验证的docker列表最新的是19.03, 安装的20.10.1版本没有在列表里。
初始化完成以后,提示的第一部分是 kubectl 的配置文件。
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
执行完成以后就可以使用kubectl连接集群了。
第二部分是用来,其它节点加入集群的。
加入节点
https://kubernetes.io/zh/docs/reference/setup-tools/kubeadm/kubeadm-join/
kubeadm join --token <token> <control-plane-host>:<control-plane-port> --discovery-token-ca-cert-hash sha256:<hash>
指定token, 主节点ip:port, 以及ca证书的hash。
直接执行提示的命令就行。
kubeadm join 192.168.1.241:6443 --token 9zjetu.b0cwkxhb7xo77k98 \
--discovery-token-ca-cert-hash sha256:0486aa133d3258e0d5b992926c45105234c5fa6ca97afb6f729c4a61be4b6617
如果忘了
可以通过 kubeadm token list
查看token。
[root@k8sadminmaster1 ~]# kubeadm token list
TOKEN TTL EXPIRES USAGES DESCRIPTION EXTRA GROUPS
9zjetu.b0cwkxhb7xo77k98 23h 2020-12-24T16:27:29+08:00 authentication,signing The default bootstrap token generated by 'kubeadm init'. system:bootstrappers:kubeadm:default-node-token
如果过期了
token有效期是24小时,如果过期了,执行下面的命令,会显示新的token。
kubeadm token create
或者这个命令直接打印出来跟init一样的,可以直接执行的join命令。
kubeadm token create --print-join-command
CA_HASH忘了
通过执行下面的命令计算CA证书的HASH。
openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
其他
join节点就是通过bootstrap-token做临时认证,然后获取证书。那个token就是bootstrap-token。
主节点可以看到自动签署的证书。 而CA证书的HASH主要是kubelet用来验证主节点的。
[root@k8sadminmaster1 ~]# kubectl get csr
NAME AGE SIGNERNAME REQUESTOR CONDITION
csr-wdr47 13m kubernetes.io/kube-apiserver-client-kubelet system:bootstrap:9zjetu Approved,Issued
[root@k8sadminmaster1 ~]#
查看节点:
[root@k8sadminmaster1 ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8sadminmaster1 NotReady master 25m v1.19.5
k8sadminnode1 NotReady <none> 17m v1.19.5
k8sadminnode2 NotReady <none> 58s v1.19.5
NotReady是因为cni插件与配置还没有。 这个状态是kubelet提供的,看一下kubelet的日志就知道了。
[root@k8sadminnode1 ~]# tail -f /var/log/messages
Dec 23 16:53:15 k8sadminnode1 kubelet: E1223 16:53:15.470821 11064 kubelet.go:2103] Container runtime network not ready: NetworkReady=false reason:NetworkPluginNotReady message:docker: network plugin is not ready: cni config uninitialized
Dec 23 16:53:16 k8sadminnode1 kubelet: W1223 16:53:16.767222 11064 cni.go:239] Unable to update cni config: no networks found in /etc/cni/net.d
Dec 23 16:53:20 k8sadminnode1 kubelet: E1223 16:53:20.480201 11064 kubelet.go:2103] Container runtime network not ready: NetworkReady=false reason:NetworkPluginNotReady message:docker: network plugin is not ready: cni config uninitialized
Dec 23 16:53:21 k8sadminnode1 kubelet: W1223 16:53:21.767371 11064 cni.go:239] Unable to update cni config: no networks found in /etc/cni/net.d
Dec 23 16:53:25 k8sadminnode1 kubelet: E1223 16:53:25.489543 11064 kubelet.go:2103] Container runtime network not ready: NetworkReady=false reason:NetworkPluginNotReady message:docker: network plugin is not ready: cni config uninitialized
安装cni网络插件
calico:
https://docs.projectcalico.org/getting-started/kubernetes/self-managed-onprem/onpremises
下载yaml文件:
https://docs.projectcalico.org/manifests/calico.yaml
注意这里,calico官方说可以自动检测配置, 不放心可以取消注释把初始化主节点是写的pod地址范围写里面。