环境规划
集群类型
Kubernetes集群大致分为两类:一主多从和多主多从
本次搭建主要以学习为主,将使用一主多从的集群类型

- 一主多从:一个Master节点和多台Node节点,搭建简单,但是有单机故障风险,适合用于测试环境。
- 多主多从:多台Master和多台Node节点,搭建麻烦,安全性高,适合用于生产环境。
安装方式
kubernetes有多种部署方式,目前主流的方式有kubeadm、minikube、二进制包
我们需要安装kubernetes的集群环境,但是又不想过于麻烦,所以选择kubeadm方式
- minikube:一个用于快速搭建单节点的kubernetes工具
- kubeadm:一个用于快速搭建kubernetes集群的工具
- 二进制包:从官网上下载每个组件的二进制包,依次去安装,此方式对于理解kubernetes组件更加有效
主机规划
| 节点类型 |
IP |
OS |
配置 |
| Master |
192.168.200.100 |
CentOS 7.9 |
2C2G + 50G |
| Node 1 |
192.168.200.101 |
CentOS 7.9 |
2C2G + 50G |
| Node 2 |
192.168.200.102 |
CentOS 7.9 |
2C2G + 50G |
环境搭建
本次环境搭建需要三台CentOS服务器(一主二从),然后在每台服务器中分别安装Docker(18.06.3)、kubeadm(1.18.0)、kubectl(1.18.0)和kubelet(1.18.0)。
没有特殊说明,就是三台机器都需要执行。
本文使用虚拟机进行环境搭建,虚拟机安装配置,请自行学习完成。
环境初始化
确定操作系统版本
关闭防火墙
1 2
| systemctl stop firewalld systemctl disable firewalld
|
关闭selinux
1 2 3 4 5 6 7 8 9
| # 查看状态 getenforce
# 临时关闭,重启后失效 setenforce 0
# 重启后生效 # 修改 SELINUX 为 disabled vim /etc/selinux/config
|
设置主机名
1 2 3 4 5 6 7 8
| # 192.168.200.100 hostnamectl set-hostname k8s-master
# 192.168.200.101 hostnamectl set-hostname k8s-node1
# 192.168.200.102 hostnamectl set-hostname k8s-node2
|
修改主机名解析
1 2 3 4 5
| cat >> /etc/hosts << EOF 192.168.200.100 k8s-master 192.168.200.101 k8s-node1 192.168.200.102 k8s-node2 EOF
|
时间同步
kubernetes要求集群中的节点时间必须精确一致,所以在每个节点上添加时间同步
1 2
| yum install ntpdate -y ntpdate ntp.aliyun.com
|
关闭swap分区
swap分区会在系统资源不够的情况下,将磁盘作为内存使用,然而磁盘的读写性能远不及内存
所以k8s是要求每个节点都禁用swap分区
1 2 3 4 5 6
| # 临时关闭 swapoff -a
# 永久关闭 # 注释掉swap分区即可 vim /etc/fstab
|
将桥接的IPv4流量传递到iptables的链
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| cat > /etc/sysctl.d/kubernetes.conf << EOF net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 net.ipv4.ip_forward = 1 vm.swappiness = 0 EOF
# 加载br_netfilter模块 modprobe br_netfilter
# 查看是否加载 lsmod | grep br_netfilter
# 生效 sysctl -p
|
开启ipvs
在kubernetes中service有两种代理模型,一种是基于iptables,另一种是基于ipvs的。ipvs的性能要高于iptables的,但是如果要使用它,需要手动载入ipvs模块
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| yum -y install ipset ipvsadm
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
# 授权、运行、检查是否加载 chmod 755 /etc/sysconfig/modules/ipvs.modules bash /etc/sysconfig/modules/ipvs.modules lsmod | grep -e ip_vs -e nf_conntrack_ipv4
|
重启一下三台机器
安装docker,kubeadm,kubelet,kubectl
安装docker
1 2 3 4 5
| wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
yum -y install docker-ce-18.06.3.ce-3.el7
systemctl enable docker && systemctl start docker
|
设置docker镜像加速器
https://ps5u5ikq.mirror.aliyuncs.com 是我申请的,都可以用,也可以自己去阿里云申请
1 2 3 4 5 6 7 8 9 10 11 12
| mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF' { "exec-opts": ["native.cgroupdriver=systemd"], "registry-mirrors": ["https://ps5u5ikq.mirror.aliyuncs.com"] } EOF
systemctl daemon-reload
systemctl restart docker
|
添加阿里云yum源
1 2 3 4 5 6 7 8 9
| cat > /etc/yum.repos.d/kubernetes.repo << EOF [kubernetes] name=Kubernetes baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64 enabled=1 gpgcheck=0 repo_gpgcheck=0 gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg EOF
|
安装kubeadm、kubelet和kubectl
1 2
| # 由于版本更新频繁,这里指定版本号部署 yum install -y kubelet-1.18.0 kubeadm-1.18.0 kubectl-1.18.0
|
为了实现Docker使用的cgroup drvier和kubelet使用的cgroup drver一致,建议修改”/etc/sysconfig/kubelet”文件的内容:
1 2 3 4 5 6
| # 修改 # KUBELET_EXTRA_ARGS="--cgroup-driver=systemd" # KUBE_PROXY_MODE="ipvs" vim /etc/sysconfig/kubelet
systemctl enable kubelet
|
查看K8S所需镜像
1
| kubeadm config images list
|
部署master节点
1 2 3 4 5 6 7
| # 由于默认拉取镜像地址k8s.gcr.io国内无法访问,这里需要指定阿里云镜像仓库地址 kubeadm init \ --apiserver-advertise-address=192.168.200.100 \ --image-repository registry.aliyuncs.com/google_containers \ --kubernetes-version v1.18.0 \ --service-cidr=10.96.0.0/12 \ --pod-network-cidr=10.244.0.0/16
|
根据提示消息,在Master节点配置kube config
1 2 3
| mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config
|
部署node节点
根据提示,在192.168.200.101和192.168.200.102上添加如下的命令
1 2
| kubeadm join 192.168.200.100:6443 --token bbzspl.kqudl7akg824xzu1 \ --discovery-token-ca-cert-hash sha256:811c7a9f9d8d1582342a0c30469a3d62927a11b55e9af3c186ad4b662ebd9a58
|
默认的token有效期为2小时,当过期之后,该token就不能用了,这时可以使用如下的命令创建token
1 2 3 4
| kubeadm token create --print-join-command
# 生成一个永不过期的token kubeadm token create --ttl 0 --print-join-command
|
查看node是否加入
1 2
| # 这里应该还没有部署CNI网络插件,所有node都是not ready的状态 kubectl get nodes
|
部署CNI网络插件
kubernetes支持多种网络插件,比如flannel、calico、canal等,任选一种即可,我们这里选择使用calico
1 2 3
| wget https://raw.githubusercontent.com/bob-zou/bob-zou.github.io/master/asserts/calico.yaml
kubectl apply -f calico.yaml
|
查看部署CNI网络插件进度
1
| kubectl get pods -n kube-system
|
等待部署完成再次查看 node状态
1 2 3 4 5 6 7
| kubectl get nodes
# 查看集群健康状况 kubectl get cs
# 集群信息 kubectl cluster-info
|
验证
在Kubernetes集群中部署一个Nginx程序,测试下集群是否正常工作
1 2 3 4 5 6 7 8 9 10 11
| # 部署Nginx kubectl create deployment nginx --image=nginx:1.14-alpine
# 暴露端口 kubectl expose deployment nginx --port=80 --type=NodePort
# 查看服务状态 kubectl get pods,svc
# 访问nginx curl 192.168.200.100:30305
|
kubernetes中kubectl命令自动补全
1 2 3 4 5 6
| yum install -y bash-completion
echo "source /usr/share/bash-completion/bash_completion" >> ~/.bashrc echo "source <(kubectl completion bash)" >> ~/.bashrc
source ~/.bashrc
|