三、集群部署
ip | 系统环境 | 主机名 |
---|---|---|
192.168.130.11 | CentOS 7.6 | Kube-master |
192.168.130.12 | CentOS 7.6 | Kube-node1 |
192.168.130.13 | CentOS 7.6 | Kube-node2 |
3.1 部署前准备
3.1.1 主机名解析
vim /etc/hosts
192.168.130.11 kube-master
192.168.130.12 kube-node1
192.168.130.13 kube-node2
3.1.2 时间同步
yum install chrony
systemctl start chronyd
systemctl enable chronyd
3.1.3 禁用swap
swapoff -a
并且注释/etc/fstab
所有与swap相关的行
3.3.4 关闭防火墙
setenforce 0
sed -i '/^SELINUX=/cSELINUX=disabled' /etc/selinux/config
systemctl stop firewalld
systemctl disable firewalld
3.3.5 加载ipvs内核模块
安装 IPVS 模块
yum -y install ipvsadm ipset sysstat conntrack libseccomp
设置开机加载配置文件
cat >>/etc/modules-load.d/ipvs.conf<<EOF
ip_vs_dh
ip_vs_ftp
ip_vs
ip_vs_lblc
ip_vs_lblcr
ip_vs_lc
ip_vs_nq
ip_vs_pe_sip
ip_vs_rr
ip_vs_sed
ip_vs_sh
ip_vs_wlc
ip_vs_wrr
nf_conntrack_ipv4
EOF
设置开机加载 IPVS 模块
systemctl enable systemd-modules-load.service # 设置开机加载内核模块
lsmod | grep -e ip_vs -e nf_conntrack_ipv4 # 重启后检查 ipvs 模块是否加载
3.3.6 下载 Docker 和 K8S
设置docker源
curl -o /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
设置k8s源
cat >>/etc/yum.repos.d/kuberetes.repo<<EOF
[kuberneres]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
enabled=1
EOF
安装 docker-ce 和 kubernetes
yum install docker-ce kubelet kubectl kubeadm -y
systemctl start docker
systemctl enable docker
systemctl enable kubelet
3.3.7 设置内核及k8s参数
设置内核参数
cat >>/etc/sysctl.conf<<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
设置kubectl忽略swap,使用ipvs
cat >/etc/sysconfig/kubelet<<EOF
KUBELET_EXTRA_ARGS="--fail-swap-on=false"
KUBE_PROXY_MODE=ipvs
EOF
3.2 部署Master
本小节的所有操作,只在Master上进行
3.2.1 拉取镜像
宿主机最好能访问国外资源,在kubeadm init 在初始化的时候会到谷歌的 docker hub 拉取镜像,如果宿主机测试无法访问 k8s.gcr.io
如果条件不允许可以参考:https://blog.csdn.net/jinguangliu/article/details/82792617,解决镜像问题。
- 提前拉取初始化需要的镜像
kubeadm config images pull
- 拉取其他源镜像
docker pull mirrorgooglecontainers/kube-apiserver:v1.14.2
docker pull mirrorgooglecontainers/kube-controller-manager:v1.14.2
docker pull mirrorgooglecontainers/kube-scheduler:v1.14.2
docker pull mirrorgooglecontainers/kube-proxy:v1.14.2
docker pull mirrorgooglecontainers/pause:3.1
docker pull mirrorgooglecontainers/etcd:3.3.10
docker pull coredns/coredns:1.3.1
利用`kubeadm config images list` 查看需要的docker image name
k8s.gcr.io/kube-apiserver:v1.14.2
k8s.gcr.io/kube-controller-manager:v1.14.2
k8s.gcr.io/kube-scheduler:v1.14.2
k8s.gcr.io/kube-proxy:v1.14.2
k8s.gcr.io/pause:3.1
k8s.gcr.io/etcd:3.3.10
k8s.gcr.io/coredns:1.3.1
# 修改tag
docker tag docker.io/mirrorgooglecontainers/kube-apiserver:v1.14.2 k8s.gcr.io/kube-apiserver:v1.14.2
docker tag docker.io/mirrorgooglecontainers/kube-scheduler:v1.14.2 k8s.gcr.io/kube-scheduler:v1.14.2
docker tag docker.io/mirrorgooglecontainers/kube-proxy:v1.14.2 k8s.gcr.io/kube-proxy:v1.14.2
docker tag docker.io/mirrorgooglecontainers/kube-controller-manager:v1.14.2 k8s.gcr.io/kube-controller-manager:v1.14.2
docker tag docker.io/mirrorgooglecontainers/etcd:3.3.10 k8s.gcr.io/etcd:3.3.10
docker tag docker.io/mirrorgooglecontainers/pause:3.1 k8s.gcr.io/pause:3.1
docker tag docker.io/coredns/coredns:1.3.1 k8s.gcr.io/coredns:1.3.1
docker rmi `docker images |grep docker.io/ |awk '{print $1":"$2}'`
3.2.2 初始化Master
使用 kubeadm 初始化 k8s 集群
kubeadm init
--apiserver-advertise-address=0.0.0.0
--apiserver-bind-port=6443
--kubernetes-version=v1.18.5
--pod-network-cidr=10.10.0.0/16
--service-cidr=172.31.0.0/16
--service-dns-domain=pansn.local
--image-repository=k8s.gcr.io
--ignore-preflight-errors=swap
--token-ttl=0
下面是最后执行成功显示的结果,需要保存这个执行结果,以让 node 节点加入集群
注意最后一行的kubeadm join
命令,后面在加入node节点时要用
- 如果初始化过程被中断可以使用下面命令来恢复
kubeadm reset
- 最好以普通用户的身份运行下面的命令
# 在当前用户家目录下创建.kube目录并配置访问集群的config 文件
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
3.2.3 部署 flannel 网络插件
- 下载falannel.yml文件
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
- 修改配置
[root@kube-master opt]# vim kube-flannel.yml
改成之前初始化时pod-network-cidr
选项对应的值
- 部署 flannel 网络插件
[root@kube-master opt]# kubectl apply -f kube-flannel.yml
3.2.4 检查k8s集群状态
- 查看 kube-system 命名空间中运行的 pods
kubectl get pods -n kube-system
- 查看 k8s 集群组件的状态
kubectl get ComponentStatus
kubectl get nodes
3.2.5 配置命令补全
yum install -y bash-completion
source /usr/share/bash-completion/bash_completion
source <(kubectl completion bash)
echo "source <(kubectl completion bash)" >> ~/.bashrc
3.3 部署node节点
本小节的所有的操作,只在 Node 节点上进行
3.3.1 加入集群
加入集群,注意在命令尾部加上 –ignore-preflight-errors=Swap ,以忽略 k8s 对主机 swap 的检查(k8s为了性能所以要求进制 swap
kubeadm join 192.168.130.11:6443
--ignore-preflight-errors=swap
--token 70hwi7.omp6t2nfwfsg4y87
--discovery-token-ca-cert-hash sha256:f4b7ea9af19c749e3e6447ceb8803c8c1d563fc3e2452e7d4422246ad4dfb0b4
返回结果,表示加入集群成功
This node has joined the cluster:
* Certificate signing request was sent to apiserver and a response was received.
* The Kubelet was informed of the new secure connection details.
Run 'kubectl get nodes' on the control-plane to see this node join the cluster.
编写最后命令写成脚本以便后续使用
3.3.2 查看进度
- node查看镜像
当 node 节点加入 K8S 集群中后,Master 会调度到 Node 节点上一些组件,用于处理集群事务,这些组件没有下载完成之前 Node 节点在集群中还是未就绪状态
在 node 执行下面命令,可以查看镜像的下载进度,下面是最终结果显示
最终显示结果
[root@kube-node1 ~]# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
k8s.gcr.io/kube-proxy v1.18.5 a1daed4e2b60 11 days ago 117MB
quay.io/coreos/flannel v0.12.0-amd64 4e9f801d2217 3 months ago 52.8MB
k8s.gcr.io/pause 3.2 80d28bedfe5d 4 months ago 683kB
可以在 Master 上使用下面命令来查看新加入的节点状态
[root@kube-master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
kube-master Ready master 82m v1.18.5
kube-node1 Ready <none> 7m14s v1.18.5
kube-node2 Ready <none> 4m17s v1.18.5
- node查看集群组件状态
kubectl get pods -n kube-system -o wide
问题汇总:
K8s集群初始化成功后,kubectl get nodes 查看节点信息时报错
解决方法:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
3.3.3 解决镜像下载慢问题
node 节点需要翻墙下载镜像太慢,建议使用 docker 镜像的导入导出功能 先将master的三个镜像打包发送到node节点,load后再jion
- 导出
docker image save -o /tmp/kube-proxy.tar k8s.gcr.io/kube-proxy
docker image save -o /tmp/flannel.tar quay.io/coreos/flannel
docker image save -o /tmp/pause.tar k8s.gcr.io/pause
- 导入
docker image load -i /tmp/kube-proxy.tar
docker image load -i /tmp/pause.tar
docker image load -i /tmp/flannel.tar