1.服务器配置
共使用3台服务器,依次配置hostname
、固定IP
、hosts
、防火墙
、selinux
和Swap
1.1 配置HOSTNAME
- master服务器:
hostnamectl --static set-hostname k8s-master
- node-1服务器:
hostnamectl --static set-hostname k8s-node1
- node-2服务器:
hostnamectl --static set-hostname k8s-node2
1.2 配置固定IP
编辑文件/etc/sysconfig/network-scripts/ifcfg-eth0
,修改BOOTPROTO
的值为static
,并在文件追加
1 | IPADDR="192.168.0.11" |
1.3 配置HOSTS
配置每台服务器的host,让每台服务器可以使用域名互相访问
1 | cat >> /etc/hosts |
最后一行回车之后,
ctrl+c
或者ctrl+d
结束输入
1.4 配置防火墙
1 | sudo systemctl stop firewalld |
1.5 配置SELinux
SELinux
,安全增强型Linux
,是一种采用安全架构的Linux
系统。因为我们不是专业的Linux
运维工程师,并且防止在后续部署过程中遇到因为SELinux
产生的问题,这里直接关闭SELinux
。
- 查看
SELinux
是否开启:执行命令/usr/sbin/sestatus -v
,查看SELinux status
的状态是否为enabled
- 关闭
SELinux
:编辑文件vi /etc/selinux/config
,设置SELINUX
为disabled
1.6 配置SWAP
k8s
想法是将实例紧密包装到尽可能接近100%
,所有的部署都应该与CPU
、内存限制固定在一起。所以,如果调度程序发送一个Pod
到一台机器,它不应该使用交换。同时,k8s
的设计者考虑到性能的原因,关闭swap
。如果在运行容器数量较多时,考虑节省资源的资源,可以添加kubelet
参数--fail-swap-on=false
来解决这个问题。
关闭Swap
的步骤:
swapoff -a
- 编辑
/etc/fstab
,注释swap
所在的行 free
# 可以通过这个命令查看swap是否关闭了
2. 部署容器
这里的容器运行时指的是:负责容器运行的软件,可选的有:containerd
、docker
和CRI-O
,我们选择docker
作为容器运行时。
配置k8s
集群,需要为每个节点安装一个容器运行时,用来为Pod
提供运行环境
2.1 为容器进行时配置Cgroups
Cgroups
是Linux
内核提供的一种可以限制单个进程或者多个进程所使用的资源的机制,可以对CPU
、内存等资源实现精细化的控制。Docker
就使用Cgroups
来对CPU
、内存等部分资源进行控制。
如果Linux
系统发行版使用systemd
来初始化系统时,初始化进程会生成并使用一个root
控制组,充当cgroup
管理器。这时systemd
和Cgroups
紧密集成,并将为每个systemd
单位分配一个Cgroup
。更多Cgroup
的内容可查看这里。
在安装容器运行时和kubelet
时,可以为其指定一个Cgroups
管理器,但k8s
官网并不推荐这种配置,在资源压力下会变得不稳定。
容器运行时和kubelet
以及systemd
使用同一个Cgroups
管理器,单个管理器会简化分配资源的视图,并且默认情况下对可用资源和使用的资源具有更一直的管理。
对于Docker
容器运行时,可以设置native.cgroupdriver=system
选项来配置。
2.2 安装docker
需要在所有的服务器节点中安装Docker
- 安装所需包
1
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
- 新增
docker
库1
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
- 安装
docker-ce
1
sudo yum update -y && sudo yum install -y containerd.io-1.2.13 docker-ce-19.03.11 docker-ce-cli-19.03.11
- 配置
Docker Daemon
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17## 创建/etc/docker目录
sudo mkdir /etc/docker
## 设置Docker Daemon
cat <<EOF | sudo tee /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"
]
}
EOF - 配置
Docker
开机启动1
2
3sudo systemctl daemon-reload
sudo systemctl restart docker
sudo systemctl enable docker
3. 安装kubeadm、kubelet和kubectl
3.1 查看节点MAC地址和product_uuid的唯一性
- 通过命令ifconfig -a查看网络的MAC地址,其中ether后面的为网卡的MAC地址
1
ifconfig -a
- 使用命令cat /sys/class/dmi/id/product_uuid对product_uuid校验
正常情况,硬件设备的网络MAC地址和product_uuid都会有唯一值,但是虚拟机中可能会存在重复值。如果这两个配置不唯一,在安装kubeadm时可能会失败
3.2 允许iptables检查桥接流量
使用命令lsmod | grep br_netfilter来查看br_netfilter模块是否被加载。如果该模块没有被加载,可执行sudo modprobe br_netfilter来加载该模块。
设置服务节点中给的sysctl配置中的net.bridge.bridge-nf-call-iptables值为1
1 | $ cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf |
3.3 安装kubeadm、kubelet和kubectl
需要在每台服务器中安装:
- kubeadm,用来初始化集群的指令
- kubelet,在集群中的每个节点上用来启动Pod和容器等
- kubectl,用来与集群通信的命令行工具
kubeadmin、kubelet和kubectl需要单独安装,因此,需要确保他们的版本相匹配
1 | $ cat > /etc/yum.repos.d/kubernetes.repo << EOF |
配置master节点
- 在
work
容器中执行其中,1
2
3
4
5$ kubeadm init \
--apiserver-advertise-address=192.168.0.31 \
--image-repository registry.aliyuncs.com/google_containers \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16
–apiserver-advertise-address,API服务器所公布的其正在监听的IP地址,如果没有设置,将会使用默认网络接口
–image-repository,拉取镜像的容器仓库
–service-cidr,为服务的虚拟IP地址另外指定的IP地址段,默认值为”10.96.0.0/12”
–pod-network-cidr, 指明 pod 网络可以使用的 IP 地址段。如果设置了这个参数,控制平面将会为每一个节点自动分配 CIDRs
为用户设置权限
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安装POD网络插件
1
$ kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
token过期重新获取join命令
1
2
3[root@test ~]# kubeadm token generate #生成token
pmiad9.1g4qrc4yvkqxggse #下条命令需要使用这个结果
[root@test ~]# kubeadm token create pmiad9.1g4qrc4yvkqxggse --print-join-command --ttl=0 #根据token输出添加命令