kubernetes(k8s)集群环境搭建

2.1 环境规划

2.1.1 集群类型

kubernetes集群大体上分为两类:一主多从和多主多从。

  • 一主多从:一台Master节点和多台Node节点,搭建简单,但是有单机故障风险,适合用于测试环境
  • 多主多从:多台Master节点和多台Node节点,搭建麻烦,安全性高,适合用于生产环境

image-20200404094800622

说明:为了测试简单,本次搭建的是 一主两从 类型的集群

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/

版权声明:
作者:admin
链接:https://www.chenxie.net/archives/2670.html
来源:蜀小陈
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
< <上一篇
下一篇>>
文章目录
关闭
目 录