1、使用kubeadm启动master节点
# 在192.168.137.10(k8s-master)节点上执行 kubeadm init --apiserver-advertise-address=192.168.137.10 --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.20.14 --service-cidr=10.0.0.0/16 --pod-network-cidr=10.244.0.0/16
kubeadm命令参数说明
--apiserver-advertise-address string 设置 apiserver 绑定的 IP. --apiserver-bind-port int32 设置apiserver 监听的端口. (默认 6443) --apiserver-cert-extra-sans strings api证书中指定额外的Subject Alternative Names (SANs) 可以是IP 也可以是DNS名称。 证书是和SAN绑定的。 --cert-dir string 证书存放的目录 (默认 "/etc/kubernetes/pki") --certificate-key string kubeadm-cert secret 中 用于加密 control-plane 证书的key --config string kubeadm 配置文件的路径. --cri-socket string CRI socket 文件路径,如果为空 kubeadm 将自动发现相关的socket文件; 只有当机器中存在多个 CRI socket 或者 存在非标准 CRI socket 时才指定. --dry-run 测试,并不真正执行;输出运行后的结果. --feature-gates string 指定启用哪些额外的feature 使用 key=value 对的形式。 -h, --help 帮助文档 --ignore-preflight-errors strings 忽略前置检查错误,被忽略的错误将被显示为警告. 例子: 'IsPrivilegedUser,Swap'. Value 'all' ignores errors from all checks. --image-repository string 选择拉取 control plane images 的镜像repo (default "k8s.gcr.io") --kubernetes-version string 选择K8S版本. (default "stable-1") --node-name string 指定node的名称,默认使用 node 的 hostname. --pod-network-cidr string 指定 pod 的网络, control plane 会自动将 网络发布到其他节点的node,让其上启动的容器使用此网络 --service-cidr string 指定service 的IP 范围. (default "10.96.0.0/12") --service-dns-domain string 指定 service 的 dns 后缀, e.g. "myorg.internal". (default "cluster.local") --skip-certificate-key-print 不打印 control-plane 用于加密证书的key. --skip-phases strings 跳过指定的阶段(phase) --skip-token-print 不打印 kubeadm init 生成的 default bootstrap token --token string 指定 node 和control plane 之间,简历双向认证的token ,格式为 [a-z0-9]{6}\.[a-z0-9]{16} - e.g. abcdef.0123456789abcdef --token-ttl duration token 自动删除的时间间隔。 (e.g. 1s, 2m, 3h). 如果设置为 '0', token 永不过期 (default 24h0m0s) --upload-certs 上传 control-plane 证书到 kubeadm-certs Secret.
2、等待片刻后,会出现如下打印:
注意最下边这句话,这是worker节点加入master用的,需要保存出来。
3、 根据打印提示,进行一系列配置:
mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config # 如果是root用户 export KUBECONFIG=/etc/kubernetes/admin.conf
4、这时候可以看一下节点情况:
kubectl get nodes
1、 在 192.168.137.20(k8s-node01)节点执行上边保存下来的命令:
kubeadm join 192.168.137.10:6443 --token bjxbuj.sf5ihqfq956225zc \ --discovery-token-ca-cert-hash sha256:e41b256edd1b35b1ce081980fa81907e7ceb8204723b27d946bebb74e3389d39
如图表示加入成功,这时在master节点执行如下命令,可以查看到
kubectl get nodes
可能出现报错情况
[root@k8s-node02 ~]# kubeadm join 192.168.137.10:6443 --token bjxbuj.sf5ihqfq956225zc
> --discovery-token-ca-cert-hash sha256:e41b256edd1b35b1ce081980fa81907e7ceb8204723b27d946bebb74e3389d39
[preflight] Running pre-flight checks
error execution phase preflight: [preflight] Some fatal errors occurred:
[ERROR FileContent–proc-sys-net-bridge-bridge-nf-call-iptables]: /proc/sys/net/bridge/bridge-nf-call-iptables contents are not set to 1
[ERROR FileContent–proc-sys-net-ipv4-ip_forward]: /proc/sys/net/ipv4/ip_forward contents are not set to 1
[preflight] If you know what you are doing, you can make a check non-fatal with--ignore-preflight-errors=...
To see the stack trace of this error execute with --v=5 or higher
解决方法
echo 1 > /proc/sys/net/bridge/bridge-nf-call-iptables echo 1 > /proc/sys/net/ipv4/ip_forward
# 查看master启动的组件 kubectl get pods -n kube-system -o wide # 拉取flannel docker pull quay.io/coreos/flannel:v0.9.1-amd64 # 创建配置文件 mkdir -p /etc/cni/net.d/ cat <<EOF> /etc/cni/net.d/10-flannel.conf > {"name":"cbr0","type":"flannel","delegate": {"isDefaultGateway": true}} > EOF mkdir /usr/share/oci-umount/oci-umount.d -p mkdir /run/flannel/ cat <<EOF> /run/flannel/subnet.env > FLANNEL_NETWORK=172.100.0.0/16 > FLANNEL_SUBNET=172.100.1.0/24 > FLANNEL_MTU=1450 > FLANNEL_IPMASQ=true > EOF vim /etc/sysconfig/kubelet # KUBELET_EXTRA_ARGS="--fail-swap-on=false" kubectl get pods --all-namespaces # 删除0/1的组件 kubectl delete pod coredns-7f89b7bc75-qnx84 -n kube-system # 将 master节点下的 /etc/cni/net.d/10-flannel.conf 复制到工作节点的相同目录下 # 主节点查看节点状态即可