前言:本博客仅作记录学习使用,部分图片出自网络,如有侵犯您的权益,请联系删除
一、安装要求
在开始之前,部署Kubernetes集群集群需要满足以下几个条件:
- 一台多多台机器,操作系统CentOS.x-86_x64
- 硬件配置:2GB或更多RAM,2个CPU或更多,硬盘30G以上、
- 集群中所有机器之间网络互通
- 可以访问外网,需要拉取镜像
- 禁止swap分区
二、软件环境
- CentOS 7
- Docker:20+
- k8s:1.23.6
三、安装步骤
1、准备环境![](https://i-blog.csdnimg.cn/direct/54619994e6134c3fb2f8ba4a4f135530.png)
角色 | IP地址 | 组件 |
---|---|---|
k8s-master | 192.168.1.10 | docker、kubectl、kubeadm、kubelet |
k8s-node1 | 192.168.1.11 | docker、kubectl、kubeadm、kubelet |
k8s-node2 | 192.168.1.12 | docker、kubectl、kubeadm、kubelet |
2、初始操作
检查操作环境的版本:
[root@k8s-master ~]# cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)
主机名解析:
为了方便集群之间的直接调用,配置主机名解析,企业中推荐使用内部DNS服务器
# 根据规划在三台主机分别设置好主机名
# hostnamectl set-hostname <hostname>
[root@k8s-master ~]# vim /etc/hosts
192.168.1.10 k8s-master
192.168.1.11 k8s-node1
192.168.1.12 k8s-node2
时间同步:
Kubernetes要求集群中的节点时间必须精确一致,这里使用chronyd服务从网络同步时间;企业中建议配置内部的会见同步服务器
[root@master ~]# systemctl start chronyd
[root@master ~]# systemctl enable chronyd
[root@master ~]# date
禁用iptables和firewalld服务:
Kubernetes和docker在运行中会产生大量的iptables规则,为了不让系统规则跟它们混淆,直接关闭系统的规则
# 1 关闭firewalld服务
[root@master ~]# systemctl stop firewalld
[root@master ~]# systemctl disable firewalld
# 2 关闭iptables服务
[root@master ~]# systemctl stop iptables
[root@master ~]# systemctl disable iptables
禁用selinux:
SELinux是linux系统中的一个安全服务,如果不关闭它,它会在集群中产生各种各样的问题
# 修改SELINUX的值为disable
[root@master ~]# vim /etc/selinux/config
...
SELINUX=disabled
...
# 注意:修改完后需要重启,重启完后,可使用getenforce查看
[root@k8s-master ~]# getenforce
Disabled
---------------------------------------------------
# 另一种方法:下面两条命令分别设置永久与临时关闭SELinux:
[root@master ~]# sed -i 's/enforcing/disabled/' /etc/selinux/config # 永久
[root@master ~]# setenforce 0 # 临时
关闭swap分区:
swap分区指的是虚拟内存分区,它的作用是物理内容使用完后,之后将磁盘空间虚拟成内存来使用。启用swap设备会对系统的性能产生非常负面的影响,因此Kubernetes要求每个节点都要禁用swap设备,若因某些原因不能关闭swap分区,就要在安装过程通过明确的参数进行配置说明
# 注释掉swap分区一行
[root@master ~]# vim /etc/fstab
# /dev/mapper/centos-swap swap defaults 0 0
-----------------------------------------------------
# swapoff -a # 临时
# sed -ri 's/.*swap.*/#&/' /etc/fstab # 永久
修改Linux的内核参数:
# 修改Linux的内核采纳数,添加网桥过滤和地址转发功能
# 编辑/etc/sysctl.d/kubernetes.conf文件,添加如下:
[root@master ~]# vim /etc/sysctl.d/kubernetes.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward=1
[root@master ~]# sysctl -w net.ipv4.ip_forward=1
# 重新加载配置
[root@master ~]# sysctl -p
# 加载网桥过滤模块
[root@master ~]# modprobe br_netfilter
# 查看网桥过滤模块是否加载成功
[root@master ~]# lsmod | grep br_netfilter
配置ipvs功能:
在Kubernetes中Service有几种工作模型:一种是基于Iptables的,一种是基于ipvs的;ipvs的性能明显要高一些,但如果需要使用它,需要手动载入ipvs模块:
# 1、安装ipset和ipvsdm
[root@master ~]# yum install ipset ipvsadm -y
# 2、添加需要加载的模块写入脚本文件
[root@master ~]# cat <<EOF> /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
EOF
# 2、为脚本添加执行权限
[root@master ~]# chmod +x /etc/sysconfig/modules/ipvs.modules
# 4.执行脚本文件
[root@master ~]# /bin/bash /etc/sysconfig/modules/ipvs.modules
# 5.查看对应的模块是否加载成功
[root@master ~]# lsmod | grep -e ip_vs -e nf_conntrack_ipv4
3、安装基础软件(所有节点)
安装Docker:
# 1、切换镜像源
[root@master ~]# wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
# 2、查看当前镜像源中支持的docker版本
[root@master ~]# yum list docker-ce --showduplicates
# 3、安装特定版本的docker-ce
# 必须制定--setopt=obsoletes=0,否则yum会自动安装更高版本
[root@master ~]# yum install --setopt=obsoletes=0 docker-ce-18.06.3.ce-3.el7 -y
# 4、添加一个配置文件
#Docker 在默认情况下使用Vgroup Driver为cgroupfs,而Kubernetes推荐使用systemd来替代cgroupfs
[root@master ~]# mkdir /etc/docker
[root@master ~]# vim /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"],
"registry-mirrors": [
"https://do.nark.eu.org",
"https://dc.j8.work",
"https://docker.m.daocloud.io",
"https://dockerproxy.com",
"https://docker.mirrors.ustc.edu.cn",
"https://docker.nju.edu.cn"
]
}
# 5、启动dokcer并加入开机自启项中
[root@master ~]# systemctl restart docker
[root@master ~]# systemctl enable docker
添加阿里云yum源:
由于kubernetes的镜像在国外,速度比较慢,这里切换成国内的镜像源
# 1、添加k8syum配置
[root@master ~]# vim /etc/yum.repod.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgchech=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
安装Kubeadm、kubelet、kubectl:
[root@master ~]# yum install -y kubelet-1.23.6 kubeadm-1.23.6 kubectl-1.23.6
# 配置kubelet的cgroup
[root@master ~]# vim /etc/sysconfig/kubelet
KUBELET_CGROUP_ARGS="--cgroup-driver=systemd"
KUBE_PROXY_MODE="ipvs"
# 设置kubelet开机自启
[root@master ~]# systemctl enable kubelet
4、部署Kubernetes Master
以下操作在master节点上进行:
准备集群镜像:
在安装kubernetes集群之前,必须要提前准备好集群需要的镜像,所需镜像可以通过下面命令查看:
[root@master ~]# kubeadm config images list
# 下载镜像
# 此镜像kubernetes的仓库中,由于网络原因,无法连接,下面提供了一种替换方案
[root@master ~]# vim /prepare-k8s.sh
images=(
kube-apiserver:v1.23.6
kube-controller-manager:v1.23.6
kube-scheduler:v1.23.6
kube-proxy:v1.23.6
pause:3.2
etcd:3.5.0
coredns:1.8.0
)
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
集群初始化:
# 创建集群
[root@master ~]# kubeadm init \
--apiserver-advertise-address=192.168.1.10 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.23.6 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16
# 创建必要文件
[root@master ~]# mkdir -p $HOME/.kube
[root@master ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@master ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config
# 出现master节点则成功
[root@master ~]# kubectl get nodes
5、加入Kubernetes Node
以下操作在node节点上操作:
在k8s-master控制台初始化成功后复制join命令:
[root@k8s-node1 ~]# kubeadm join 192.168.113.120:6443 --token w34ha2.66if2c8nwmeat9o7 --discovery-token-ca-cert-hash sha256:20e2227554f8883811c01edd850f0cf2f396589d32b57b9984de3353a7389477
如果初始的token不小心清空,可通过以下命令获取或重新申请:
# token过期则重新申请
[root@master ~]# kubeadm token create
# token没有过期则通过如下命令获取:
[root@master ~]# kubeadm token list
获取 --discovery-token-ca-cert-hash值:
[root@master ~]# openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | \
openssl dgst -sha256 -hex | sed 's/^.* //'
获取到值后需要在前面拼接上 sha256 使用;
6、部署CNI网络插件
下载 calico 配置文件,可能会网络超时:
[root@k8s-master ~]# cd ./opt
[root@k8s-master opt]# mkdir k8s
[root@k8s-master opt]# cd k8s/
[root@k8s-master k8s]# curl https://docs.projectcalico.org/manifests/calico.yaml -O
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 83 100 83 0 0 136 0 --:--:-- --:--:-- --:--:-- 136
[root@k8s-master k8s]# ls
calico.yaml
修改 calico.yaml 文件中的 CALICO_IPV4POOL_CIDR 配置,修改为与初始化的 cidr 相同:
删除镜像 docker.io/ 前缀,避免下载过慢导致失败
[root@k8s-master k8s]# grep imgae calico.yaml
[root@k8s-master k8s]# sed -i 's#docker.io/##g' calico.yaml
# 建议分别在三个节点中pull下所需镜像
[root@k8s-master k8s]# kubectl apply -f calico.yml
-----------------检查排错---------------------------
# 查看节点情况
[root@k8s-master k8s]# kubectl get pods -n kube-system
# 查看详细信息
[root@k8s-master k8s]# kubectl describe po <xxx> -n kube-system
7、测试Kubernetes集群
# 创建部署
[root@k8s-master ~]# kubectl create deployment nginx --image=nginx
# 暴露端口
[root@k8s-master ~]# kubectl expose deployment nginx --port=80 --type=NodePort
# 查看 pod 以及服务信息
[root@k8s-master ~]# kubectl get pod,svc
NAME READY STATUS RESTARTS AGE
pod/nginx-85b98978db-4gclp 0/1 ContainerCreating 0 24s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 5h15m
service/nginx NodePort 10.101.177.187 <none> 80:32754/TCP 12s
# 访问
[root@k8s-master ~]# curl 192.168.1.10:32754
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
...
致谢
在此,我要对所有为知识共享做出贡献的个人和机构表示最深切的感谢。同时也感谢每一位花时间阅读这篇文章的读者,如果文章中有任何错误,欢迎留言指正。
学习永无止境,让我们共同进步!!