kubeadm快速安装k8s集群

大番茄 2020年12月22日 2,675次浏览

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的时候会报这个错误, 不过新版的已经自动添加这两个参数了。

其它
  1. 时间同步
  2. 主节点需要有其它节点的解析。
    在执行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分配地址的范围。


image.png

这里提示已验证的docker列表最新的是19.03, 安装的20.10.1版本没有在列表里。


image.png


初始化完成以后,提示的第一部分是 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
image.png
注意这里,calico官方说可以自动检测配置, 不放心可以取消注释把初始化主节点是写的pod地址范围写里面。
image.png