目录
[部署worker node 组件](#部署worker node 组件)
[部署 CNI 网络组件](#部署 CNI 网络组件)
[部署 flannel](#部署 flannel)
之前我们已经部署安装好了master的组件和etcd ,接下来到node节点的组件和网络相关的组件了
部署worker node 组件
在所有的node节点上操作↓
创建kubernetes工作目录
mkdir -p /opt/kubernetes/{bin,cfg,ssl,logs}
cd /opt
编辑kubelet 和 proxy 脚本文件
vim kubelet.sh
#!/bin/bash
NODE_ADDRESS=1 DNS_SERVER_IP={2:-"10.0.0.2"}
cat >/opt/kubernetes/cfg/kubelet <<EOF KUBELET_OPTS="--logtostderr=false \ --v=2 \ --log-dir=/opt/kubernetes/logs \ --hostname-override=${NODE_ADDRESS} \ --network-plugin=cni \ --kubeconfig=/opt/kubernetes/cfg/kubelet.kubeconfig \ --bootstrap-kubeconfig=/opt/kubernetes/cfg/bootstrap.kubeconfig \ --config=/opt/kubernetes/cfg/kubelet.config \ --cert-dir=/opt/kubernetes/ssl \ --pod-infra-container-image=registry.cn-hangzhou.aliyuncs.com/google-containers/pause-amd64:3.0" EOF
cat >/opt/kubernetes/cfg/kubelet.config <<EOF kind: KubeletConfiguration apiVersion: kubelet.config.k8s.io/v1beta1 address: ${NODE_ADDRESS} port: 10250 readOnlyPort: 10255 cgroupDriver: cgroupfs clusterDNS:
- ${DNS_SERVER_IP} clusterDomain: cluster.local failSwapOn: false authentication: anonymous: enabled: true EOF
>/usr/lib/systemd/system/kubelet.service <<EOF [Unit] Description=Kubernetes Kubelet After=docker.service Requires=docker.service
Service\] EnvironmentFile=/opt/kubernetes/cfg/kubelet ExecStart=/opt/kubernetes/bin/kubelet $KUBELET_OPTS Restart=on-failure KillMode=process
\[Install\] WantedBy=multi-user.target EOF
systemctl daemon-reload systemctl enable kubelet systemctl restart kubelet
vim proxy.sh
#!/bin/bash
NODE_ADDRESS=$1
cat \>/opt/kubernetes/cfg/kube-proxy \<\ Description=Kubernetes Proxy After=network.target Service
EnvironmentFile=-/opt/kubernetes/cfg/kube-proxy ExecStart=/opt/kubernetes/bin/kube-proxy \$KUBE_PROXY_OPTS Restart=on-failure Install
WantedBy=multi-user.target EOF systemctl daemon-reload systemctl enable kube-proxy systemctl restart kube-proxy 为两个文件赋权 chmod +x kubelet.sh proxy.sh 回到master节点操作↓ 将 kubelet、kube-proxy 拷贝到两台node节点机器上 scp kubelet kube-proxy [email protected]:/opt/kubernetes/bin/ scp kubelet kube-proxy [email protected]:/opt/kubernetes/bin/ mkdir /opt/k8s/kubeconfig cd /opt/k8s/kubeconfig/ vim kubeconfig.sh #!/bin/bash BOOTSTRAP_TOKEN=(awk -F ',' '{print 1}' /opt/kubernetes/cfg/token.csv) APISERVER=$1 SSL_DIR=$2 export KUBE_APISERVER="https://:6443$APISERVER" kubectl config set-cluster kubernetes \ --certificate-authority=$SSL_DIR/ca.pem \ --embed-certs=true \ --server=${KUBE_APISERVER} \ --kubeconfig=bootstrap.kubeconfig kubectl config set-credentials kubelet-bootstrap \ --token=${BOOTSTRAP_TOKEN} \ --kubeconfig=bootstrap.kubeconfig kubectl config set-context default \ --cluster=kubernetes \ --user=kubelet-bootstrap \ --kubeconfig=bootstrap.kubeconfig kubectl config use-context default --kubeconfig=bootstrap.kubeconfig kubectl config set-cluster kubernetes \ --certificate-authority=$SSL_DIR/ca.pem \ --embed-certs=true \ --server=${KUBE_APISERVER} \ --kubeconfig=kube-proxy.kubeconfig kubectl config set-credentials kube-proxy \ --client-certificate=$SSL_DIR/kube-proxy.pem \ --client-key=$SSL_DIR/kube-proxy-key.pem \ --embed-certs=true \ --kubeconfig=kube-proxy.kubeconfig kubectl config set-context default \ --cluster=kubernetes \ --user=kube-proxy \ --kubeconfig=kube-proxy.kubeconfig kubectl config use-context default --kubeconfig=kube-proxy.kubeconfig 赋权 chmod +x kubeconfig.sh 运行 ./kubeconfig.sh 172.16.233.101 /opt/k8s/k8s-cert/ 把运行脚本后生成的配置文件 bootstrap.kubeconfig、kube-proxy.kubeconfig 拷贝到 node 节点 scp bootstrap.kubeconfig kube-proxy.kubeconfig [email protected]:/opt/kubernetes/cfg/ scp bootstrap.kubeconfig kube-proxy.kubeconfig [email protected]:/opt/kubernetes/cfg/ 接下来进行RBAC授权 先给kubectl绑定默认cluster-admin管理员集群角色,授权集群操作权限 kubectl create clusterrolebinding cluster-system-anonymous --clusterrole=cluster-admin --user=system:anonymous 再进行授权,使用户 kubelet-bootstrap 能够有权限发起 CSR 请求证书 kubectl create clusterrolebinding kubelet-bootstrap --clusterrole=system:node-bootstrapper --user=kubelet-bootstrap 顺序错误可能导致执行失败 回到node01节点上操作 启动kubelet服务 cd /opt ./kubelet.sh 172.16.233.103 ps aux | grep kubelet master节点 检查到 node01 节点的 kubelet 发起的 CSR 请求,Pending 表示等待集群给该节点签发证书 kubectl get csr 通过 CSR 请求 kubectl certificate approve node-csr-BDV5w8pO9C9Dx5rTshnhprdGMF03WVtg2o9CR7i3RdY approved 、issued 表示已授权CSR 请求并签发证书 查看节点,由于网络插件还没有部署,所以节点状态会显示notready kubectl get node 在node01节点上操作 加载 ip_vs 模块 for i in (ls /usr/lib/modules/(uname -r)/kernel/net/netfilter/ipvs|grep -o "^.*");do echo i; /sbin/modinfo -F filename i >/dev/null 2>&1 && /sbin/modprobe $i;done 启动 proxy 服务 cd /opt/ ./proxy.sh 172.16.233.103 ps aux | grep kube-proxy Flannel 的功能是让集群中的不同节点主机创建的 Docker 容器都具有全集群唯一的虚拟 IP 地址。 Flannel 是 Overlay 网络的一种,也是将 TCP 源数据包封装在另一种网络包里面进行路由转发和通信,目前支持 UDP、VXLAN、Host-gw 3种数据转发方式。 Flannel UDP 模式的工作原理: 数据从主机 A 上 Pod 的源容器中发出后,经由所在主机的 docker0/cni0 网络接口转发到 flannel0 接口,flanneld 服务监听在 flannel0 虚拟网卡的另外一端。 Flannel 通过 Etcd 服务维护了一张节点间的路由表。源主机 A 的 flanneld 服务将原本的数据内容封装到 UDP 报文中, 根据自己的路由表通过物理网卡投递给目的节点主机 B 的 flanneld 服务,数据到达以后被解包,然后直接进入目的节点的 flannel0 接口, 之后被转发到目的主机的 docker0/cni0 网桥,最后就像本机容器通信一样由 docker0/cni0 转发到目标容器。 Flannel VXLAN 模式跨主机的工作原理: 数据帧从主机 A 上 Pod 的源容器中发出后,经由所在主机的 docker0/cni0 网络接口转发到 flannel.1 接口 ;flannel.1 收到数据帧后添加 VXLAN 头部,封装在 UDP 报文中;主机 A 通过物理网卡发送封包到主机 B 的物理网卡中 ;主机 B 的物理网卡再通过 VXLAN 默认端口 4789 转发到 flannel.1 接口进行解封装;解封装以后,内核将数据帧发送到 cni0,最后由 cni0 发送到桥接到此接口的容器 B 中。 在 node01 节点上操作 上传 cni-plugins-linux-amd64-v0.8.6.tgz 和 flannel.tar 到 /opt 中 cd /opt/ docker load -i flannel.tar mkdir /opt/cni/bin tar zxvf cni-plugins-linux-amd64-v0.8.6.tgz -C /opt/cni/bin 在 master01 节点上操作 上传 kube-flannel.yml 文件到 /opt/k8s 目录中,部署 CNI 网络 cd /opt/k8s kubectl apply -f kube-flannel.yml kubectl get pods -n kube-system 列出 部署 CNI 网络组件
部署 flannel
kube-system
命名空间中的所有 Pod