部署好LB以后,接下来就正式开始部署k8s
部署前准备
1.各个节点设置注解名和域名解析,包括两个haproxy节点
[root@k8s-master01 ~]# hostnamectl set-hostname k8s-master01
[root@k8s-master02 ~]# hostnamectl set-hostname k8s-master02
[root@k8s-master03 ~]# hostnamectl set-hostname k8s-master03
[root@k8s-node01 ~]# hostnamectl set-hostname k8s-node01
所有节点配置域名解析
[root@k8s-master01 ~]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
10.0.0.11 k8s-master01
10.0.0.12 k8s-master02
10.0.0.13 k8s-master03
10.0.0.14 k8s-node01
2.所有k8s集群节点关闭防火墙,关闭selinux,关闭交换分区,内核参数
关闭防火墙
[root@k8s-master01 ~]# systemctl stop firewalld && systemctl disable firewalld
关闭selinux
[root@k8s-master01 ~]# vi /etc/selinux/config
SELINUX=disabled
关闭交换分区
[root@k8s-master01 ~]# sed -ri 's/.*swap.*/#&/' /etc/fstab
配置内核参数
[root@k8s-master01 ~]# echo 1 > /proc/sys/net/bridge/bridge-nf-call-iptables
关闭selinux要重启机器,或者setenforce 0,这里重启机器
[root@k8s-master01 ~]# reboot
3.本次部署kube-proxy采用的ipvs模式,为支持ipvs,所有k8s集群节点需做如下设置
加载ipvs模块
[root@k8s-master01 ~]# cat > /etc/sysconfig/modules/ipvs.modules <<EOF
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
EOF
#执行脚本
[root@k8s-master01 ~]# chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack_ipv4
#安装相关管理工具
[root@k8s-master01 ~]# yum install ipset ipvsadm -y
配置内核参数
[root@k8s-master01 ~]# cat > /etc/sysctl.d/k8s.conf <<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_nonlocal_bind = 1
net.ipv4.ip_forward = 1
vm.swappiness=0
EOF
[root@k8s-master01 ~]# sysctl --system
基础公共部分
在所有k8s集群节点上执行
1.配置docker 和k8s的yum源
docker的yum源
[root@k8s-master01 ~]# [root@k8s-master yum.repos.d]# cd /etc/yum.repos.d && wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
k8s的yum源
[root@k8s-master01 ~]# vim /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes Repo
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
gpgcheck=0
enabled=1
2.安装docker,这里安装的docker 18.09版本
[root@k8s-master01 ~]# yum install docker-ce-18.09.0-3.el7 -y
3.安装kubelet,kubectl和kubeadm
[root@k8s-master01 ~]# yum install -y kubelet-1.15.2 kubectl-1.15.2 kubeadm-1.15.2
4.修改docker的cgroups,然后启动docker
[root@k8s-master01 ~]# vi /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"]
}[root@k8s-master01 ~]# systemctl enable docker && systemctl start docker
5.设置kubelet开机自启动
[root@k8s-master01 ~]# systemctl enable kubelet
6.导入k8s相关的镜像包
链接:https://pan.baidu.com/s/1MoV3mIAI4hSVxjqNECgGyw
提取码:zcw9
[root@k8s-master01 ~]# docker load -i k8s-v1.15.2.tar
包括k8s自身组件镜像和flannel网络插件镜像
初始化集群
1.在master01节点上编辑集群初始化配置文件
[root@k8s-master01 ~]# vi kubeadm-config.yaml
apiVersion: kubeadm.k8s.io/v1beta2
bootstrapTokens:
- groups:
- system:bootstrappers:kubeadm:default-node-token
token: abcdef.0123456789abcdef
ttl: 24h0m0s
usages:
- signing
- authentication
kind: InitConfiguration
localAPIEndpoint:
advertiseAddress: 10.0.0.11
bindPort: 6443
nodeRegistration:
criSocket: /var/run/dockershim.sock
name: k8s-master01
taints:
- effect: NoSchedule
key: node-role.kubernetes.io/master
---
apiServer:
timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta2
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controlPlaneEndpoint: "10.0.0.10:6444"
controllerManager: {}
dns:
type: CoreDNS
etcd:
local:
dataDir: /var/lib/etcd
imageRepository: k8s.gcr.io
kind: ClusterConfiguration
kubernetesVersion: v1.15.2
networking:
dnsDomain: cluster.local
podSubnet: "10.244.0.0/16"
serviceSubnet: 10.96.0.0/12
scheduler: {}
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
featureGates:
SupportIPVSProxyMode: true
mode: ipvs
配置文件中有几个地方需要注意:
advertiseAddress: 10.0.0.11 #这里的值为master01节点的ip
name: k8s-master01 #这里为节点的主机名
controlPlaneEndpoint: "10.0.0.10:6444" #这里为LB的代理ip和端口,即:vip:port
imageRepository: k8s.gcr.io #镜像库的地址,如果采用的是官方的镜像,填写 k8s.gcr.io,如果是其他镜像站点,对应修改
kubernetesVersion: v1.15.2 #这里指定安装的k8s的版本,如果是其他版本需要对应修改
mode: ipvs #使用ipvs模式
另外由于本次部署采用的flannel网络插件,所以指定了serviceSubnet和podSubnet
2.初始化集群
[root@k8s-master01 ~]# kubeadm init --config=kubeadm-config.yaml --upload-certs
注意:在使用controlPlaneEndpoint LB转发的情况下面,必须确保LB安装成功,能够正确转发的情况才能够初始化成功。
如果希望简化,可以只部署一个haproxy即可,即不需要LB高可用,只需要单节点的haproxy转发即可。
初始化成功后,这个时候master01的状态还是NotReady状态,需要安装CNI网络插件
这里控制台会输出加入master节点和加入worker节点的join命令,记录下来后面会用到。
3.配置kubectl
[root@k8s-master01 ~]# mkdir -p $HOME/.kube
[root@k8s-master01 ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@k8s-master01 ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config
4.安装CNI网络插件,这里部署的是flannel
[root@k8s-master01 ~]# wget https://raw.githubusercontent.com/coreos/flannel/v0.10.0/Documentation/kube-flannel.yml
[root@k8s-master02 ~]# kubectl apply -f kube-flannel.yml
添加master节点
1.在master02和master03上执行初始化后控制台输出的join命令。
[root@k8s-master02 ~]# kubeadm join 10.0.0.10:6444 --token abcdef.0123456789abcdef --discovery-token-ca-cert-hash sha256:ea623cd2ccfda8492e50b28baec1ac2115ad8009083c6a8899e5699edcc4cfce --control-plane --certificate-key 5bc7a9ba2aa9785e31e1925a641d2796a31e4343a59cc9839f0e0da4b99d8560
[root@k8s-master03 ~]# kubeadm join 10.0.0.10:6444 --token abcdef.0123456789abcdef --discovery-token-ca-cert-hash sha256:ea623cd2ccfda8492e50b28baec1ac2115ad8009083c6a8899e5699edcc4cfce --control-plane --certificate-key 5bc7a9ba2aa9785e31e1925a641d2796a31e4343a59cc9839f0e0da4b99d8560
这里执行join命令的时候出现过两个问题。
1)输出
[preflight] Running pre-flight checks
后界面没有日志输出一直阻塞的情况,如果遇到这种情况,可以重启节点,然后再次执行join命令。
2)界面一直阻塞在添加状态,系统日志提示拉取flannel镜像失败,这里可以事先将flannel用到的镜像pull到节点上。
添加worker节点
在node-01节点节点上执行添加worker节点的join命令
[root@k8s-node01 ~]# ubeadm join 10.0.0.10:6444 --token abcdef.0123456789abcdef --discovery-token-ca-cert-hash sha256:a2d2c6def4a4e21774206ce3de2b0009c58de32d8b1b241eb4b468aecf761955
检查集群状态
1.检查节点状态
[root@k8s-master01 ~]# kubectl get node
2.检查系统组件状态
[root@k8s-master01 ~]# kubectl get po -n kube-system
至此,部署完成高可用的k8s集群。