k8s-部署 Kubernetes 集群(kubeadm方式)
一 机器准备
IP | 主机名 | 角色 | 配置 | 安装组件 |
192.168.198.150 | master-1 | master | 2U2G |
master组件 etcd kubectl |
192.168.198.151 | master-2 | master | 2U2G | master组件 etcd kubectl |
192.168.198.152 | master-3 | master | 2U2G | master组件 etcd kubectl |
192.168.198.153 | node-1 | worker | 2U2G | worker组件 |
192.168.198.154 | node-2 | worker | 2U2G | worker组件 |
192.168.198.155 | node-3 | worker | 2U2G | worker组件 |
二 环境准备(所有节点)
所有机器关闭防火墙 selinux swap分区
所有机器做好相互解析 时间同步
可在master-1节点上生成密钥对 并将公钥拷贝至其他节点 方便通信与传输文件
#关闭防火墙 systemctl stop firewalld systemctl disable firewalld #关闭selinux setenforce 0 sed -ri "s/(^SELINUX=)(.*)/\1disabled/" /etc/selinux/config #关闭swap分区 swapoff -a sed -i.bak 's/^.*swap/#&/' /etc/fstab #相互解析 [root@localhost ~]# cat /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 192.168.198.150 master-1 192.168.198.151 master-2 192.168.198.152 master-3 192.168.198.153 node-1 192.168.198.154 node-2 192.168.198.155 node-3 #时间同步略 #建议用master节点上的一台服务器同步外网时间 其他节点服务器同步这台服务器时间
配置内核参数
[root@localhost ~]# cat /etc/sysctl.d/kubernetes.conf 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 [root@localhost ~]# sysctl --system
加载ipvs模块
[root@localhost ~]# yum -y install ipset ipvsadm [root@localhost ~]# cat /etc/sysconfig/modules/ipvs.modules #!/bin/bash modprobe -- ip_vs modprobe -- ip_vs_rr modprobe -- ip_vs_wrr modprobe -- ip_vs_sh modprobe -- nf_conntrack_ipv4 [root@localhost ~]# chmod +x /etc/sysconfig/modules/ipvs.modules [root@localhost ~]# /etc/sysconfig/modules/ipvs.modules
三 安装docker(所有节点)
下载docker
#下载docker源 cd /etc/yum.repos.d/ curl -O http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo #下载docker(本次下载18.06版本) #可用 yum list docker-ce --showduplicates 查看可下载版本 yum -y install docker-ce-18.06.0.ce
配置docker
[root@localhost ~]# mkdir /etc/docker [root@localhost ~]# cat /etc/docker/daemon.json { "exec-opts": ["native.cgroupdriver=systemd"], "log-driver": "json-file", "log-opts": { "max-size": "100m" }, "storage-driver": "overlay2", "storage-opts": [ "overlay2.override_kernel_check=true" ], #下为镜像加速器 可不写 也可加入自己的镜像加速器地址 "registry-mirrors": ["https://xxxxxx.mirror.aliyuncs.com"] } [root@localhost ~]# systemctl enable docker --now
四 安装kubelet(所有节点)
下载k8s源
[root@localhost ~]# cat /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
下载kubeadm kubelet kubectl ipvsadm(前三版本要一致 不然容易出错 ipvsadm可选择下载)
#查看可下载版本 yum list --showduplicates|egrep kubeadm #下载1.18.0版本 yum install -y kubeadm-1.18.0-0 kubelet-1.18.0-0 kubectl-1.18.0-0 ipvsadm #先将kubelet设为开机自启(还没配网络 起不来) systemctl enable kubelet
五 安装负载均衡(master节点)(单master无需部署)
在master上安装kube-apiserver kube-scheduler kube-controller-manager
kube-scheduler 和 kube-controller-manager 可以以集群模式运行 通过 leader 选举产生一个工作进程 其它进程处于阻塞模式
kube-apiserver可以运行多个实例 但对其它组件需要提供统一的访问地址 该地址需要高可用
创建 haproxy 启动脚本并启动
#!/bin/bash MasterIP1=192.168.198.150 MasterIP2=192.168.198.151 MasterIP3=192.168.198.152 MasterPort=6443 # apiserver端口 docker run -d --restart=always --name haproxy-k8s -p 6444:6444 \ -e MasterIP1=$MasterIP1 \ -e MasterIP2=$MasterIP2 \ -e MasterIP3=$MasterIP3 \ -e MasterPort=$MasterPort wise2c/haproxy-k8s
创建keepalived 启动脚本并启动
#!/bin/bash VIRTUAL_IP=192.168.122.100 # VIP INTERFACE=eth0 # 网卡名称 NETMASK_BIT=24 CHECK_PORT=6444 # Haproxy端口 RID=10 VRID=160 MCAST_GROUP=224.0.0.18 docker run -itd --restart=always --name=keepalived-k8s \ --net=host --cap-add=NET_ADMIN \ -e VIRTUAL_IP=$VIRTUAL_IP \ -e INTERFACE=$INTERFACE \ -e NETMASK_BIT=$NETMASK_BIT \ -e CHECK_PORT=$CHECK_PORT \ -e RID=$RID -e VRID=$VRID \ -e MCAST_GROUP=$MCAST_GROUP wise2c/keepalived-k8s
测试
创建成功后在每台master节点上查看容器是否正常运行
查看每台master节点上的6444端口是否被监听
在有VIP的机器关闭haproxy容器或keepalived容器看看VIP能否正常漂移
六 初始化master(master-1)
创建初始化配置文件
#创建配置文件目录 mkdir k8s cd k8s/ #生成配置文件 kubeadm config print init-defaults > init.yml
根据实际环境修改初始化配置文件
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: 192.168.198.150 #改为本机IP bindPort: 6443 nodeRegistration: criSocket: /var/run/dockershim.sock name: master-1 taints: - effect: NoSchedule key: node-role.kubernetes.io/master --- apiServer: timeoutForControlPlane: 4m0s apiVersion: kubeadm.k8s.io/v1beta2 certificatesDir: /etc/kubernetes/pki clusterName: kubernetes controlPlaneEndpoint: "192.168.122.100:6444" # 添加 VIP:PORT controllerManager: {} dns: type: CoreDNS etcd: local: dataDir: /var/lib/etcd imageRepository: registry.aliyuncs.com/google_containers # 使用国内镜像仓库 kind: ClusterConfiguration kubernetesVersion: v1.18.0 #版本号 networking: dnsDomain: cluster.local serviceSubnet: 10.96.0.0/12 podSubnet: 10.244.0.0/16 # 添加 pod子网,和Flannel中要一致 scheduler: {} #添加下列数据 --- apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration mode: ipvs
初始化master-1
此过程需要等待几分钟时间 如果中途失败 再次初始化前先执行 kubeadm reset 命令清理 然后再执行init或join操作
kubeadm init --config=init.yml --upload-certs | tee kubeadm-init.log
成功后记住回显中添加master和node节点的命令(也可到保存的文件中查看)后续需用其添加节点
第一条为添加master节点 第二条为添加node节点
token有效期为两小时 过期后可输入命令重新生成
kubeadm init phase upload-certs --upload-certs
七 配置kubectl( 无论在master节点或node节点 要能够执行kubectl命令必须进行配置 有两种配置方式 )
1 通过配置文件(初始化master后的回显)
2 通过环境变量
echo 'export KUBECONFIG=/etc/kubernetes/admin.conf' >> ~/.bashrc source ~/.bashrc
八 部署网络插件(master-1)
#下载kube-flannel.yml文件 wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml #执行安装 kubectl apply -f kube-flannel.yml #查看信息(等待) kubectl get po -n kube-system
九 添加节点
将/etc/kubernetes/admin.conf 这个文件拷贝至你需要操作的机器上
执行添加节点命令添加相应的节点