kubernetes(k8s)集群环境搭建
2.1 环境规划
2.1.1 集群类型
kubernetes集群大体上分为两类:一主多从和多主多从。
- 一主多从:一台Master节点和多台Node节点,搭建简单,但是有单机故障风险,适合用于测试环境
- 多主多从:多台Master节点和多台Node节点,搭建麻烦,安全性高,适合用于生产环境
说明:为了测试简单,本次搭建的是 一主两从 类型的集群
2.1.2 安装方式
kubernetes有多种部署方式,目前主流的方式有minikube、kubeadm、二进制包
minikube
一个用于快速搭建单节点kubernetes的工具
kubeadm
一个用于快速搭建kubernetes集群的工具
kubeadm 是官方社区推出的一个用于快速部署kubernetes 集群的工具,这个工具能通过两条指令完成一个kubernetes 集群的部署:
- 创建一个Master 节点: kubeadm init
- 将Node 节点加入到当前集群中: kubeadm join <Master 节点的IP 和端口>
官方地址:https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm/
二进制包
从github 下载发行版的二进制包,手动部署每个组件,组成Kubernetes 集群。
Kubeadm 降低部署门槛,但屏蔽了很多细节,遇到问题很难排查。如果想更容易可控,推荐使用二进制包部署Kubernetes 集群,虽然手动部署麻烦点,期间可以学习很多工作原理,也利于后期维护。
说明:现在需要安装kubernetes的集群环境,但是又不想过于麻烦,所以选择使用kubeadm方式
2.2 环境搭建
本次环境搭建需要安装三台CentOS7服务器(一主两从),然后在每台服务器上都安装docker,kubeadm,kubectl,kubelet程序。
2.2.1 主机规划
本实验使用VMware虚拟出三台主机,配置均为:CPU:2核、内存:2G、磁盘:40G
主机名 | IP地址 | 操作系统 | 安装组件 |
---|---|---|---|
master | 192.168.92.163 | CentsOS7.9 | docker,kubeadm,kubectl,kubelet |
node1 | 192.168.92.164 | CentsOS7.9 | docker,kubeadm,kubectl,kubelet |
node2 | 192.168.92.165 | CentsOS7.9 | docker,kubeadm,kubectl,kubelet |
2.2.2 环境初始化(每一台都需要做)
1) 检查操作系统的版本
# 此方式下安装kubernetes集群要求CentOS7.5以上
[root@localhost ~]# cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)
2)修改主机名
# 设置master
[root@localhost ~]# hostnamectl set-hostname master
# 设置node1
[root@localhost ~]# hostnamectl set-hostname node1
# 设置node2
[root@localhost ~]# hostnamectl set-hostname node2
3)主机名解析
为了方便后面集群节点间的直接调用,在这配置以下主机名解析,企业中推荐使用内部DNS服务器。
# 将以下分别添加到3台服务器的 /etc/hosts 文件中
cat >> /etc/hosts << EOF
192.168.92.163 master
192.168.92.164 node1
192.168.92.165 node2
EOF
4) 时间同步
kubernetes要求集群中的节点时间必须精确一致。
[root@localhost ~]# yum install ntpdate -y
[root@localhost ~]# ntpdate ntp.aliyun.com
5) 禁用iptables和firewalld服务
kubernetes和docker在运行中会产生大量的iptables规则,为了不让系统规则跟它们混淆,直接关闭系统的规则。
# 关闭iptables服务
systemctl stop iptables && systemctl disable iptables
# 关闭firewalld服务
systemctl stop firewalld && systemctl disable firewalld
6)禁用selinux
selinux是linux系统下的一个安全服务,如果不关闭它,在安装集群中会产生各种各样的奇葩问题
# vim /etc/selinux/config
SELINUX=disabled
或:
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
setenforce 0
7)禁用swap分区
swap分区指的是虚拟内存分区,它的作用是在物理内存使用完之后,将磁盘空间虚拟成内存来使用。
启用swap设备会对系统的性能产生非常负面的影响,因此kubernetes要求每个节点都要禁用swap设备。
但是如果因为某些原因不能关闭swap分区,就需要在集群安装过程中通过明确的参数进行配置说明。
# 编辑 /etc/fstab ,注释掉swap分区一行
# 修改完成之后需要重启服务器生效
8)修改linux内核参数
允许 iptables 检查桥接流量:
确保 br_netfilter
模块被加载。这一操作可以通过运行 lsmod | grep br_netfilter
来完成。若要显式加载该模块,可执行 sudo modprobe br_netfilter
。
为了让你的 Linux 节点上的 iptables 能够正确地查看桥接流量,你需要确保在你的 sysctl
配置中将 net.bridge.bridge-nf-call-iptables
设置为 1。例如:
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sudo sysctl --system
# 加载网桥过滤模块
modprobe br_netfilter
# 查看网桥过滤模块是否加载成功
# lsmod | grep br_netfilter
br_netfilter 22256 0
bridge 151336 1 br_netfilter
9)配置ipvs功能
在kubernetes中service有两种代理模型,一种是基于iptables的,一种是基于ipvs的,两种比较的话,ipvs的性能明显要高一些,但是如果要使用它,需要手动载入ipvs模块
# 1. 安装ipset和ipvsadm
yum install ipset ipvsadm -y
# 2. 添加需要加载的模块写入脚本文件
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
# 3. 为脚本文件添加执行权限
chmod +x /etc/sysconfig/modules/ipvs.modules
# 4. 执行脚本文件
/bin/bash /etc/sysconfig/modules/ipvs.modules
# 5. 查看对应的模块是否加载成功
[root@localhost ~]# lsmod | grep -e ip_vs -e nf_conntrack_ipv4
nf_conntrack_ipv4 15053 0
nf_defrag_ipv4 12729 1 nf_conntrack_ipv4
ip_vs_sh 12688 0
ip_vs_wrr 12697 0
ip_vs_rr 12600 0
ip_vs 145458 6 ip_vs_rr,ip_vs_sh,ip_vs_wrr
nf_conntrack 139264 2 ip_vs,nf_conntrack_ipv4
libcrc32c 12644 3 xfs,ip_vs,nf_conntrack
10)重启服务器
上面步骤完成之后,需要重启服务器
reboot
2.2.3 安装Docker(每一台都需要做)
参考:https://www.chenxie.net/archives/2209.html
0) 卸载机器上的老版本
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
如果你机器上有安装过 Docker 的话, /var/lib/docker/ 目录会被保留下来,删除它。
rm -rf /var/lib/docker/
1) 安装所需软件包
yum install -y yum-utils device-mapper-persistent-data lvm2
2) 配置稳定的仓库
# 国内推荐使用:
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
3) 安装 Docker
yum install -y docker-ce docker-ce-cli containerd.io
4) 配置Cgroup Driver和阿里云加速器
添加一个配置文件
Docker在默认情况下使用的Cgroup Driver为cgroupfs,而kubernetes推荐使用systemd来代替cgroupfs
mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
"exec-opts": ["native.cgroupdriver=systemd"],
"registry-mirrors": ["https://cvy84kji.mirror.aliyuncs.com"]
}
EOF
5) 启动 Docker
启动并自启:
systemctl start docker && systemctl enable docker
停止:
systemctl stop docker
重启:
systemctl restart docker
2.2.4 安装kubernetes组件(每一台都需要做)
配置源:
下面来自:https://developer.aliyun.com/mirror/kubernetes
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[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
EOF
安装指定版本的kubelet, kubeadm,kubectl。因为当前最新版的kubeadm不支持安装kubernetes1.22.9版本
setenforce 0
yum install -y --nogpgcheck kubelet-1.22.9-0 kubeadm-1.22.9-0 kubectl-1.22.9-0
systemctl enable kubelet && systemctl start kubelet
配置kubelet的cgroup:
vim /etc/sysconfig/kubelet 添加下面的配置:
KUBELET_CGROUP_ARGS="--cgroupd-driver=systemd"
KUBE_PROXY_MODE="ipvs"
2.2.5 集群初始化
下面操作只在 master 节点上操作
注意:
--kubernetes-version 指定要安装的kubernetes的版本
--apiserver-advertise-address 指定为你的master节点IP
--image-repository 指定用于拉取控制control plane image的容器仓库,默认值:"k8s.gcr.io 国内无法访问
# 创建集群
kubeadm init \
--kubernetes-version v1.22.9 \
--pod-network-cidr=10.244.0.0/16 \
--service-cidr=10.96.0.0/12 \
--apiserver-advertise-address=192.168.92.163 \
--image-repository registry.cn-hangzhou.aliyuncs.com/google_containers
运行结果:
Your Kubernetes control-plane has initialized successfully!
To start using your cluster, you need to run the following as a regular user:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
Alternatively, if you are the root user, you can run:
export KUBECONFIG=/etc/kubernetes/admin.conf
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
https://kubernetes.io/docs/concepts/cluster-administration/addons/
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join 192.168.92.163:6443 --token qqnygl.2gd9e5ehy39i29j0 \
--discovery-token-ca-cert-hash sha256:c73a6409d5d77eb9c26290cd3556a3ab2798ad3c1252d7709b3f973c8a24fe06
按照提示在master上执行开始使用集群:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
按照提示在node1、ndoe2上执行加入集群:
kubeadm join 192.168.92.163:6443 --token qqnygl.2gd9e5ehy39i29j0 \
--discovery-token-ca-cert-hash sha256:c73a6409d5d77eb9c26290cd3556a3ab2798ad3c1252d7709b3f973c8a24fe06
运行示例:
[root@node1 ~]# kubeadm join 192.168.92.163:6443 --token qqnygl.2gd9e5ehy39i29j0 \
> --discovery-token-ca-cert-hash sha256:c73a6409d5d77eb9c26290cd3556a3ab2798ad3c1252d7709b3f973c8a24fe06
[preflight] Running pre-flight checks
[preflight] Reading configuration from the cluster...
[preflight] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -o yaml'
[kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml"
[kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env"
[kubelet-start] Starting the kubelet
[kubelet-start] Waiting for the kubelet to perform the TLS Bootstrap...
This node has joined the cluster:
* Certificate signing request was sent to apiserver and a response was received.
* The Kubelet was informed of the new secure connection details.
Run 'kubectl get nodes' on the control-plane to see this node join the cluster.
在master上查看集群状态:
[root@master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master NotReady control-plane,master 143m v1.22.9
node1 NotReady <none> 48m v1.22.9
node2 NotReady <none> 48m v1.22.9
# 看到状态都是 NotReady 状态,因为网络插件还没有安装
2.2.6 安装网络插件
kubernetes支持多种网络插件,比如 flannel、calico、canal 等待,任选一种使用即可,本次选择 flannel
下面操作只在master节点执行,插件使用的是 DaemonSet的控制器,它会在每个节点上运行
# 获取 flannel 的配置文件
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
# 使用配置文件启动 flannel
[root@master ~]# kubectl apply -f kube-flannel.yml
Warning: policy/v1beta1 PodSecurityPolicy is deprecated in v1.21+, unavailable in v1.25+
podsecuritypolicy.policy/psp.flannel.unprivileged created
clusterrole.rbac.authorization.k8s.io/flannel created
clusterrolebinding.rbac.authorization.k8s.io/flannel created
serviceaccount/flannel created
configmap/kube-flannel-cfg created
daemonset.apps/kube-flannel-ds created
# 稍等一会,可通过 kubectl get pod -A 查看进度
# 再次查看集群节点的状态,全都都 Ready 了
[root@master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master Ready control-plane,master 145m v1.22.9
node1 Ready <none> 51m v1.22.9
node2 Ready <none> 51m v1.22.9
2.2.7 测试kubernetes 集群
接下来在kubernetes集群中部署一个nginx程序,测试一下集群是否正常工作。
# 部署nginx
[root@master ~]# kubectl create deployment nginx --image=nginx
deployment.apps/nginx created
# 暴露端口(创建service)
[root@master ~]# kubectl expose deployment nginx --port=80 --type=NodePort
service/nginx exposed
# 查看服务状态
[root@master ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-85b98978db-l72rf 1/1 Running 0 72s
[root@master ~]# kubectl get service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 153m
nginx NodePort 10.99.99.207 <none> 80:32328/TCP 66s
# 可以看到 nginx 外部访问的端口为 32328
浏览器访问测试:随便使用master、node1、node2的Ip访问 32328 都能够访问到nginx
http://192.168.92.163:32328/
http://192.168.92.164:32328/
http://192.168.92.165:32328/
共有 0 条评论