k8s部署详解

1.配置ip地址

master1 ip地址:192.168.31.138
worker1 ip地址:192.168.31.139
worker2 ip地址:192.168.31.140

其中一台ip地址如下
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kMil5GVN-1662208050062)(C:\Users\ASUS\AppData\Roaming\Typora\typora-user-images\image-20220527153231270.png)]

2.主机名称解析

#准备三台机器,每台机器分别命名为master,node1,node2
hostnamectl set-hostname master
hostnamectl set-hostname node1
hostnamectl set-hostname node2
#进入 /etc/hosts,在每台主机上加入:
192.168.31.138 master
192.168.31.139 node1
192.168.31.140 node2

3.关闭防火墙

[root@localhost ~]# systemctl stop firewalld   #临时关闭
[root@localhost ~]# systemctl disable firewalld  #永久关闭

#确认是否运行
[root@localhost ~]# firewall-cmd --state
not running

4.SELINUX配置

#查看SELINUX状态
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
SELINUX=enforcing
# SELINUXTYPE= can take one of three values:
#     targeted - Targeted processes are protected,
#     minimum - Modification of targeted policy. Only selected processes are protected. 
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted 

#配置SELINUX
sed -ri 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config

5.主机时间同步

由于最小化安装系统,需要单独安装ntpdate
yum install ntpdate -y
#在每台主机上输入命令 crontab -e
0 */1 * * * ntpdate time1.aliyun.com    #每小时通过一次 分时日周月
#其中一台如下:
[root@master1 ~]# crontab -e
no crontab for root - using an empty one
crontab: installing new crontab
[root@master1 ~]# ntpdate time1.aliyun.com
27 May 15:56:35 ntpdate[1505]: adjust time server 203.107.6.88 offset -0.019750 sec
[root@master1 ~]# crontab -l
0 */1 * * * ntpdate time1.aliyun.com
#输入 date,每台主机时间一致

6.永久关闭swap分区

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

[root@master1 ~]# cat /etc/fstab

#
# /etc/fstab
# Created by anaconda on Tue May 24 20:51:58 2022
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/centos_miwifi--r4--srv-root /                       xfs     defaults        0 0
UUID=2c843bc2-bad2-4244-bfe2-f2dcf0f00419 /boot                   xfs     defaults        0 0
/dev/mapper/centos_miwifi--r4--srv-swap swap                    swap    defaults        0 0

#在每台主机上输入 vi /etc/fstab
#在最后一行添加注释
# /dev/mapper/centos_miwifi--r4--srv-swap swap                    swap    defaults        0 0
[root@master1 ~]# free -m   #此时swap是有分区的
              total        used        free      shared  buff/cache   available
Mem:           1819         169        1420           9         229        1503
Swap:          2047           0        2047
#重启reboot
[root@master1 ~]# free -m
              total        used        free      shared  buff/cache   available
Mem:           1819         164        1478           9         176        1505
Swap:             0           0           0

7.添加网桥过滤

添加网桥过滤及地址转发
[root@master1 ~]# vi /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模块 
[root@master1 ~]# modprobe br_netfilter
#查看是否加载
[root@master1 ~]# lsmod | grep br_netfilter
br_netfilter           22256  0 
bridge                151336  1 br_netfilter

#刷新配置文件
[root@master1 ~]# sysctl -p /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

8.开启ipvs

8.1安装ipset及ipvsadm
yum install ipset ipvsadm -y
8.2在所有节点执行如下脚本
添加需要加载的模块
[root@master1 ~]# 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@master1 ~]# ls /etc/sysconfig/modules/
ipvs.modules
[root@master1 ~]# ll /etc/sysconfig/modules/       #默认权限是644
总用量 4
-rw-r--r-- 1 root root 124 527 16:42 ipvs.modules
授权,运行,检查是否加载
[root@master1 ~]# chmod 755 /etc/sysconfig/modules/ipvs.modules
[root@master1 ~]# sh /etc/sysconfig/modules/ipvs.modules
[root@master1 ~]# lsmod | grep ip_vs_rr
ip_vs_rr               12600  0 
ip_vs                 145458  6 ip_vs_rr,ip_vs_sh,ip_vs_wrr

9.在manager节点及worker节点安装指定版本的docker-ce

#如果以前安装过docker,先卸载旧版本
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
#安装所需软件包
yum install -y device-mapper-persistent-data  lvm2
#配置docker源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum clean all
yum makecache
#查询可安装版本
yum list docker-ce --showduplicates | sort -r

如若安装过程中遇到如下问题:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0RgVRI9d-1662207988366)(C:\Users\ASUS\AppData\Roaming\Typora\typora-user-images\image-20220527192407190.png)]

解决办法:

#这个是因为系统默认没有安装这个命令,这个命令在yum-utils 包里,可以通过命令yum -y install yum-utils 安装就可以了
yum install -y yum-utils

安装指定版本docker

yum install --setopt=obsoletes=0 docker-ce-20.10.9-3.el7 -y
#查看docker版本
docker version
#启动docker
systemctl enable docker && systemctl start docker
[root@worker2 ~]# docker version
Client: Docker Engine - Community
 Version:           20.10.16

10.修改docker-ce服务配置文件

修改其目的是为了后续使用/etc/docker/daemon.json来进行更多配置

vim /usr/lib/systemd/system/docker.service
我下载的是最新版本,所以要删除-H后面的内容,有些版本没有就不需要修改

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hvTHX4Se-1662207988367)(C:\Users\ASUS\AppData\Roaming\Typora\typora-user-images\image-20220527195215228.png)]

vim /etc/docker/daemon.json
{
	"exec-opts":["native.cgroupdriver=systemd"]
}

{
  "registry-mirrors": ["https://l1tdhsj3.mirror.aliyuncs.com"]
}

systemctl daemon-reload
systemctl restart docker
#查看docker是否启动
systemctl status docker

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ehBQMwe3-1662207988367)(C:\Users\ASUS\AppData\Roaming\Typora\typora-user-images\image-20220527201149161.png)]

11.部署软件及配置

软件安装

所有k8s集群节点均需安装,默认YUM源是谷歌
需求kubeadmkubletkubectldocker-ce
初始化集群,管理集群等,版本为:1.18.0-0用于接收api-server指令,对pod生命周期进行管理,版本为:1.18.0-0集群命令行管理工具,版本为:1.18.0-020.10.9
vi /etc/yum.repos.d/k8s.repo
[kubernetes]
name=Kubernetes
baseurl=http://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
查看kubeadm版本
yum list|grep kubeadm
kubeadm.x86_64                            1.18.0-0                     kubernetes

不指定kubernetes版本默认会安装最新版本,但最新版本可能与docker-ce版本不兼容,所以最好指定版本安装
yum install -y kubelet-1.18.0 kubeadm-1.18.0 kubectl-1.18.0  

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MlowmCQ9-1662207988368)(C:\Users\ASUS\AppData\Roaming\Typora\typora-user-images\image-20220903192329062.png)]

12.软件设置

主要配置kublet,如果不配置可能会导致k8s集群无法启动
为了实现docker使用的cgroupdriver与kubelet使用的cgroup的一致性,建议修改如下文件内容
[root@master1 ~]# cat /etc/sysconfig/kubelet
KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"
#启动kubelet
systemctl enable kubelet
查看kubelet的运行状态
systemctl status kubelet

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-r4S2c3LZ-1662207988368)(C:\Users\ASUS\AppData\Roaming\Typora\typora-user-images\image-20220528143155439.png[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8uZkEuZT-1662207988806)(C:\Users\ASUS\AppData\Roaming\Typora\typora-user-images\image-20220903191910361.png)]]

13.k8s集群容器镜像准备

由于使用kubeadm部署集群,集群所有核心组件均以Pod运行,需要为主机准备镜像,不同角色主机准备不同镜像
[root@master1 ~]# kubeadm config images list
k8s.gcr.io/kube-apiserver:v1.24.1
k8s.gcr.io/kube-controller-manager:v1.24.1
k8s.gcr.io/kube-scheduler:v1.24.1
k8s.gcr.io/kube-proxy:v1.24.1
k8s.gcr.io/pause:3.7
k8s.gcr.io/etcd:3.5.3-0
k8s.gcr.io/coredns/coredns:v1.8.6

#列出镜像列表到文件中,便于下载使用
[root@master1 ~]# kubeadm config images list >> image.list

查看已列出镜像文件列表
[root@master1 ~]# cat image.list
k8s.gcr.io/kube-apiserver:v1.18.20
k8s.gcr.io/kube-controller-manager:v1.18.20
k8s.gcr.io/kube-scheduler:v1.18.20
k8s.gcr.io/kube-proxy:v1.18.20
k8s.gcr.io/pause:3.2
k8s.gcr.io/etcd:3.4.3-0
k8s.gcr.io/coredns:1.6.7

编写镜像下载脚本,因为在安装kubernetes过程中,需要从k8s.grc.io仓库中拉取所需镜像文件,但由于网络原因,无法从goole中拉取镜像,可以替换国内源
[root@master1 ~]# vim image.list
#!/bin/bash
images=(
	kube-apiserver:v1.18.20  #每个人安装的版本不一样,选择自己前面安装的版本即可
	kube-controller-manager:v1.18.20
	kube-scheduler:v1.18.20
	kube-proxy:v1.18.20
	pause:3.2
	etcd:3.4.3-0
	coredns:1.6.7
)

for imageName in ${images[@]};do
	docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName
	docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName k8s.gcr.io/$imageName
	docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName 
done

14.集群初始化

下面的操作只需要在master节点上执行

#创建集群
kubeadm init \
	--apiserver-advertise-address=192.168.1.138 \
	--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

出现successfully表明创建集群成功:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iR2qRk3A-1662207988368)(C:\Users\ASUS\AppData\Roaming\Typora\typora-user-images\image-20220903194600609.png)]

下一步可以根据 上一步创建集群给出的提示来执行命令

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CjgPAZwp-1662207988369)(C:\Users\ASUS\AppData\Roaming\Typora\typora-user-images\image-20220903195024146.png)]

#创建必要文件
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
#在node1,node2上执行如下命令
kubeadm join 192.168.1.138:6443 --token x3jsr6.1seu0czams441m1n \
    --discovery-token-ca-cert-hash sha256:92c9f1eadc7496880e35e4e3ffdf6c
#默认token有效期为24小时,当过期之后,该token就不可用了。这时需要重新创建token
kubeadm token create --print-join-command
#拉取flannel网络
kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml

此时可以查看node1,node2的 kubelet运行状态,同时可以发现master主机上的状态是ready

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sTIMwgp2-1662207988369)(C:\Users\ASUS\AppData\Roaming\Typora\typora-user-images\image-20220903200034647.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-H1lm4aIU-1662207988369)(C:\Users\ASUS\AppData\Roaming\Typora\typora-user-images\image-20220903200054417.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-S55SceaP-1662207988369)(C:\Users\ASUS\AppData\Roaming\Typora\typora-user-images\image-20220903200458074.png)]

15.集群测试

#创建一个nginx服务
kubectl create deployment nginx  --image=nginx:1.14-alpine
#暴露端口
kubectl expose deploy nginx  --port=80 --target-port=80  --type=NodePort
#查看服务
kubectl get pod,svc

最终访问浏览器,查看运行结果

[外链图片转存中...(img-BoYBrWNO-1662207988370)]

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐