主机准备

VMware安装三台CentOS7虚拟机,一台作为master节点,2台作为worker节点。

主机名 操作系统 CPU核数 内存 角色
master1 CentOS7最小化 2 2G master
worker1 CentOS7最小化 2 2G worker
worker2 CentOS7最小化 2 2G worker

主机网络配置

设置主机名

1
hostnamectl set-hostname XXX

设置IP

编辑配置文件

1
vi /etc/sysconfig/network-scripts/ifcfg-ens33

添加如下设置:

1
2
3
4
5
BOOTPROTO="none"  #获取ip方式,把dhcp改为none
IPADDR="192.168.216.XXX"
PREFIX="24" #设置子网掩码 或者"NETMASK=255.255.255.0"
GATEWAY="192.168.xxx.xxx"
DNS1="119.29.29.29"

重启网卡:

1
systemctl restart network

查看ip

1
ip addr

设置主机名称解析

1
cat /etc/hosts

添加

1
2
3
192.168.xxx.xxx master1 
192.168.xxx.xxx worker1
192.168.xxx.xxx worker2

主机安全配置

关闭防火墙

1
2
3
4
systemctl stop firewalld     #关闭防火墙
systemctl disable firewalld #禁止防火墙开机启动
firewall-cmd --state #查看防火墙状态,确认是否运行
# not running

SELINUX配置

禁用selinux

1
2
3
sed -ri 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config  #替换配置文件
reboot #重启
getenforce #查看状态:Disabled

主机时间同步

由于最小化安装系统,需要单独安装ntpdate

1
2
yum -y install ntpdate  #安装时间同步程序
crontab -l 0 */1 * * * ntpdate time1.aliyun.com #设置定时任务,从阿里服务器同步时间

永久关闭swap分区

使用kubeadm部署必须关闭swap分区,修改配置文件后需要重启操作系统。

1
2
3
4
cat /etc/fstab
#/dev/mapper/centos-swap swap ... 注释掉该行
reboot #重启
free -m #检查swap分区是否存在

添加网桥过滤

添加网桥过滤及地址转发

1
2
3
4
5
6
cat /etc/sysctl.d/k8s.conf
#输入以下内容
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
vm.swappiness = 0

加载br_netfilter模块

1
modprobe br_netfilter

查看是否加载

1
lsmod | grep br_netfilter

加载网桥过滤配置文件,让刚刚添加的k8s.conf配置文件生效

1
sysctl -p /etc/sysctl.d/k8s.conf

开启ipvs

安装ipsetipvsadm

1
yum -y install ipset ipvsadm

添加需要加载的模块,编辑配置文件
vi /etc/sysconfig/modules/ipvs.modules

1
2
3
4
5
6
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
1
2
3
chmod 755 /etc/sysconfig/modules/ipvs.modules  #授权
bash /etc/sysconfig/modules/ipvs.modules #执行脚本
lsmod | grep -e ip_vs -e nf_conntrack_ipv4 #检查模块是否加载

集群软件安装

软件 作用 版本
kubeadm 初始化集群、管理集群等 1.17.2
kubelet 用于接收api-server指令,对pod生命周期进行管理 1.17.2
kubectl 集群命令行管理工具 1.17.2
docker-ce 容器管理 18.06.3

vim /etc/yum.repos.d/k8s.repo

谷歌YUM源

1
2
3
4
5
6
7
8
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/ doc/yum-key.gpg
https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg

阿里云YUM源

1
2
3
4
5
6
7
8
[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

docker安装

yum源获取,使用使用清华镜像源作为docker-ce的安装源

1
wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo

查看docker-ce版本,对版本排序

1
yum list docker-ce.x86_64 -- showduplicates | sort -r

安装指定版本docker-ce,此版本不需要修改服务启动文件及iptables默认规则链策略

1
yum -y install --setopt=obsoletes=0 docker-ce-18.06.3.ce-3.el7

查看docker-ce服务配置文件(可不修改)

1
cat /usr/lib/systemd/system/docker.service

添加配置文件/etc/docker/daemon.json

1
2
3
4
cat /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"]
}

k8s安装

安装指定版本kubeadmkubeletkubectl
/etc/yum.repos.d下新建文件k8s.repo,内容填写为阿里云k8s镜像源

1
2
yum list kubeadm.x86_64 -- showduplicates | sort -r  #查看版本
yum -y install --setopt=obsoletes=0 kubeadm-1.17.2-0 kubelet-1.17.2-0 kubectl-1.17.2-0 #安装

软件设置:
主要配置kubelet,如果不配置可能会导致k8s集群无法启动。
为了实现docker使用的cgroupdriverkubelet使用的cgroup的一致性,建议修改如下文件内容。

1
2
vim /etc/sysconfig/kubelet
KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"

设置开机启动,集群初始化后自动启动

1
systemctl enable kubelet

k8s集群容器镜像准备

Master主机镜像

由于使用kubeadm部署集群,集群所有核心组件均以Pod运行,需要为主机准备镜像,不同角色主机准备不同镜像。

查看集群使用的容器镜像,将镜像列表输出到文件中,便于下载使用

1
kubeadm config images list >> image.list

修改文件image.list,保存为镜像下载脚本image.pull

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/bin/bash
img_list='
k8s.gcr.io/kube-apiserver:v1.17.2
k8s.gcr.io/kube-controller-manager:v1.17.2
k8s.gcr.io/kube-scheduler:v1.17.2
k8s.gcr.io/kube-proxy:v1.17.2
k8s.gcr.io/pause:3.1
k8s.gcr.io/etcd:3.4.3-0
k8s.gcr.io/coredns:1.6.5
'
for img in $img_list
do
docker pull $img
done

执镜像下载脚本:sh image.pull

查看已下载镜像:docker images

拉取k8s镜像需要科学上网。
如无法从google官网拉取镜像,也可以用通过我分享的百度云下载到本地,提取码:6mkm

Worker主机镜像

在master节点中保存k8s.gcr.io/kube-proxy:v1.17.2k8s.gcr.io/pause:3.1镜像

1
2
docker save -o kube-proxy.tar k8s.gcr.io/kube-proxy:v1.17.2
docker save -o pause.tar k8s.gcr.io/pause:3.1

复制到2个worker节点:

1
2
scp kube-proxy.tar pause.tar worker1:/root
scp kube-proxy.tar pause.tar worker2:/root

2个worker节点分别导入镜像:

1
2
docker load -i kube-proxy.tar
docker load -i pause.tar

集群部署

k8s集群初始化

在master节点执行初始化操作:

1
kubeadm init --kubernetes-version=v1.17.2 --pod-network-cidr=172.16.0.0/16 --apiserver-advertise-address=192.168.xxx.xxx #master ip

准备集群管理文件

1
2
3
mkdir .kube
cp /etc/kubernetes/admin.conf ./.kube/config
chown $(id -u):$(id -g) .kube/config #当前是root用户操作,该步骤可省略

网络插件使用

calico镜像准备

百度云下载,提取码:3ea6

1
2
3
4
docker load -i calico-cni.tar
docker load -i calico-node.tar
docker load -i pod2daemon-flexvol.tar
docker load -i kube-controllers.tar

修改calico资源清单文件calico.yml
由于calico自身网络发现机制有问题,因此需要修改calico使用的物理网卡,添加607及608行

1
2
3
4
5
6
7
8
9
10
11
12
            # Cluster type to identify the deployment type
- name: CLUSTER_TYPE
value: "k8s,bgp"
# Auto-detect the BGP IP address.
- name: IP
value: "autodetect"
# 添加下面2行内容
- name: IP_AUTODETECTION_METHOD
value: "interface=eth.*" #这里视系统网卡实际情况而定,虚拟机这里是ens33,所以这里应该设置为ens.*
607 # Enable IPIP
608 - name: CALICO_IPV4POOL_IPIP
value: "Always"

修改620行指定的ip地址段,设置为初始化时指定的值:

1
2
3
4
5
6
7
8
            # The default IPv4 pool to create on startup if none exists. Pod IPs will be
# chosen from this range. Changing this value after installation will have
# no effect. This should fall within `--cluster-cidr`.
- name: CALICO_IPV4POOL_CIDR
620 value: "10.224.0.0/16" # 修改为172.16.0.0/16
# Disable file logging so `kubectl logs` works.
- name: CALICO_DISABLE_FILE_LOGGING
value: "true"

在应用caclico资源清单文件之前,需要把calico所有的镜像导入到node节点中。

1
2
# 应用calico资源清单文件
kubectl apply -f calico.yml

添加工作节点到集群

2个worker节点先导入calico相关镜像,然后执行kubeadm join操作。
该命令参照kubeadm init初始化操作时生成的输出,2个worker节点分别执行:

1
kubeadm join 192.168.xxx.xxx:6443 --token m0rpym.522tija0299geb8h --discovery-token-ca-cert-hash sha256:cef7351d9fefc67868f22aa3122165dd01f63e 95870d2fb22197ee66c61b18d6

加入时报错:error execution phase preflight: couldn’t validate the identity of the API Server: abort connecting to API servers after timeout of 5m0s

  1. 检查主机的防火墙是否关闭;

  2. token错误或者已失效,生成新的token。

    1
    2
    3
    4
    #得到token
    kubeadm token create
    #得到discovery-token-ca-cert-hash
    openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'

验证k8s集群可用性方法

1
2
3
4
5
#查看节点状态
kubectl get nodes
#查看集群健康状态
kubectl get cs
kubectl cluster-info