Kubernetes 集群环境搭建

1.环境规划

1.1 集群类型

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

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

  • 多主多从:多台Master节点和多台Node节点,搭建麻烦,安全性高,适合用于生产环境

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

1.2 安装方式

kubernetes有多种部署方式,目前主流的方式有kubeadm、minikube、二进制包

  • minikube:一个用于快速搭建单节点kubernetes的工具

  • kubeadm:一个用于快速搭建kubernetes集群的工具

  • 二进制包 :从官网下载每个组件的二进制包,依次去安装,此方式对于理解kubernetes组件更加有效

说明:现在需要安装kubernetes的集群环境,但是又不想过于麻烦,所以选择使用kubeadm方式

1.2.3 单机部署

官方推荐使用minikube,此方式主要用于体验。

Minikube

Minikube是由Kubernetes社区维护的单机版的Kubernetes集群,支持macOS, Linux, and Windows等多种操作系统平台,使用最新的官方stable版本,并支持Kubernetes的大部分功能,从基础的容器编排管理,到高级特性如负载均衡Ingress权限控制等。非常适合作为Kubernetes入门,或开发测试环境使用。Minikube实际是跑在本地的虚拟机中的,所以,需要先安装一套Hypervisor


    官方地址:https://kubernetes.io/docs/setup/minikube/

1.3 主机规划

k8s单master集群

k8s多master集群

作用IP地址操作系统配置
Master172.16.90.111Centos7.9 基础设施服务器2颗CPU 4G内存 50G硬盘
Node1172.16.90.112Centos7.9 基础设施服务器2颗CPU 4G内存 50G硬盘
Node2172.16.90.113Centos7.9 基础设施服务器2颗CPU 4G内存 50G硬盘

2.环境搭建

 本次环境搭建需要安装三台Centos服务器(一主二从),k8s采用1.24.2版本。

2.1 主机安装

安装虚拟机过程中注意下面选项的设置:

  • 操作系统环境:CPU(2C) 内存(4G) 硬盘(50G)

  • 语言选择:中文简体

  • 软件选择:基础设施服务器

  • 分区选择:自动分区

  • 网络配置:按照下面配置网路地址信息

网络地址:172.16.90.111  (每台主机都不一样  分别为111、112、113)
子网掩码:255.255.255.0
默认网关:172.16.90.254
DNS:    223.5.5.5

  • 主机名设置:按照下面信息设置主机名

master节点: master
node节点:   node1
node节点:   node2

2.2 环境初始化

2.1.1 检查操作系统版本

# 此方式下安装kubernetes集群要求Centos版本要在7.9
[root@master ~]# cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)

2.2.2 主机名解析

为了方便后面集群节点间的直接调用,在这配置一下主机名解析,企业中推荐使用内部DNS服务器

# 主机名成解析 编辑三台服务器的/etc/hosts文件,添加下面内容
172.16.90.111  master
172.16.90.112  node1
172.16.90.113  node2

2.2.3 时间同步

kubernetes要求集群中的节点时间必须精确一致,这里直接使用chronyd服务从网络同步时间。

企业中建议配置内部的时间同步服务器

# 安装chrony
[root@master ~]# yum install chrony
# 修改配置文件
[root@master ~]# vim /etc/chrony.conf
server ntp1.aliyun.com iburst

# 启动chronyd服务
[root@master ~]# systemctl start chronyd
# 设置chronyd服务开机自启
[root@master ~]# systemctl enable chronyd
# chronyd服务启动稍等几秒钟,就可以使用date命令验证时间了
[root@master ~]# date

2.2.4 禁用iptables和firewalld服务

kubernetes和docker在运行中会产生大量的iptables规则,为了不让系统规则跟它们混淆,直接关闭系统的规则

# 1 关闭firewalld服务
[root@master ~]# systemctl stop firewalld
[root@master ~]# systemctl disable firewalld
[root@master ~]# firewall-cmd --state
not running

# 2 关闭iptables服务
[root@master ~]# systemctl stop iptables
[root@master ~]# systemctl disable iptables

2.2.5 禁用selinux

   selinux是linux系统下的一个安全服务,如果不关闭它,在安装集群中会产生各种各样的奇葩问题

# 编辑 /etc/selinux/config 文件,修改SELINUX的值为disabled
# 注意修改完毕之后需要重启linux服务
SELINUX=disabled

sed -i '/^SELINUX=/c SELINUX=disabled' /etc/selinux/config
setenfoce 0
 [root@master ~]# sestatus
SELinux status:                 disabled

2.2.6 禁用swap分区

  •   swap分区指的是虚拟内存分区,它的作用是在物理内存使用完之后,将磁盘空间虚拟成内存来使用
  •   启用swap设备会对系统的性能产生非常负面的影响,因此kubernetes要求每个节点都要禁用swap设备
  •   但是如果因为某些原因确实不能关闭swap分区,就需要在集群安装过程中通过明确的参数进行配置说明
# 编辑分区配置文件/etc/fstab,注释掉swap分区一行
# 注意修改完毕之后需要重启linux服务
 UUID=455cc753-7a60-4c17-a424-7741728c44a1 /boot    xfs     defaults        0 0
 /dev/mapper/centos-home /home                      xfs     defaults        0 0
# /dev/mapper/centos-swap swap                      swap    defaults        0 0

2.2.7 升级操作系统内核

# 导入elrepo gpg key
[root@master ~]# rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org

# 安装elrepo YUM源仓库
[root@master ~]# yum -y install https://www.elrepo.org/elrepo-release-7.0-4.el7.elrepo.noarch.rpm

# 安装kernel-ml版本,ml为长期稳定版本,lt为长期维护版本
[root@master ~]# yum --enablerepo="elrepo-kernel" -y install kernel-ml.x86_64

# 设置grub2默认引导为0
[root@master ~]# grub2-set-default 0

# 重新生成grub2引导文件
[root@master ~]# grub2-mkconfig -o /boot/grub2/grub.cfg

# 更新后,需要重启,使用升级的内核生效。
[root@master ~]# reboot

# 重启后,需要验证内核是否为更新对应的版本
[root@master ~]# uname -r
5.18.10-1.el7.elrepo.x86_64

2.2.8 修改linux内核参数

# 修改linux的内核参数,添加网桥过滤和地址转发功能
# 编辑/etc/sysctl.d/kubernetes.conf文件,添加如下配置:
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
vm.swappiness=0
# 重新加载配置
[root@master ~]# sysctl -p /etc/sysctl.d/kubernetes.conf
# 加载网桥过滤模块
[root@master ~]# modprobe br_netfilter
# 查看网桥过滤模块是否加载成功
[root@master ~]# lsmod | grep br_netfilter

2.2.9 配置ipvs功能

  在kubernetes中service有两种代理模型,一种是基于iptables的,一种是基于ipvs

两者比较的话,ipvs的性能明显要高一些,但是如果要使用它,需要手动载入ipvs模块

# 1 安装ipset和ipvsadm
[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
EOF

# 3 为脚本文件添加执行权限
[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

2.3 基础环境

k8s基本环境准备

  由于kubernetes的镜像源在国外,速度比较慢,这里切换成国内的镜像源,本文使用阿里云YUM源

$ cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=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
EOF

$ yum clean all && yum makecache
# 集群软件安装
安装kubeadm、kubelet和kubectl
# yum install kubeadm kubelet kubectl -y

# 查看所有的可用版本
$  yum list  kubeadm  kubelet kubectl --showduplicates | sort -r

# 默认安装的版本就是最新版1.24.X,当然也可以指定版本安装 ,如 yum install kubelet-1.16.2 kubeadm-1.16.2 kubectl-1.16.2
$ yum install  kubeadm  kubelet kubectl

#安装后查看版本
$ kubeadm version
kubeadm version: &version.Info{Major:"1", Minor:"24", GitVersion:"v1.24.2", GitCommit:"f66044f4361b9f1f96f0053dd46cb7dce5e990a8", GitTreeState:"clean", BuildDate:"2022-06-15T14:20:54Z", GoVersion:"go1.18.3", Compiler:"gc", Platform:"linux/amd64"}

# 配置kubelet的cgroup
# 为了实现docker使用的cgroupdriver与kubelet使用的cgroup的一致性,建议修改如下文件内容。

$ cat <<EOF > /etc/sysconfig/kubelet
KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"
KUBE_PROXY_MODE="ipvs"
EOF

# 设置kubelet开机自启
# systemctl enable kubelet

  注:做完基础环境,建议创建快照,后续会分别使用三种不同方式创建集群。

2.4 集群创建方式1:containerd

安装containerd

本文采用在线方式安装

所有节点都安装

直接安装docker-ce源
# step 1: 安装必要的一些系统工具
yum install -y yum-utils device-mapper-persistent-data lvm2
# Step 2: 添加软件源信息
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# Step 3
sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
# Step 4:查询软件包
yum list | grep containerd
containerd.io.x86_64                      1.6.6-3.1.el7                docker-ce-stable
# Step 5:安装软件包
[root@node1 ~]# yum install containerd -y

# Step 6:初始化默认配置
containerd config default | tee /etc/containerd/config.toml

# Step 7:修改containerd配置更改cgroup
sed -i "s#SystemdCgroup\ \=\ false#SystemdCgroup\ \=\ true#g" /etc/containerd/config.toml

# Step 8:修改镜像源
sed -i "s#registry.k8s.io#registry.aliyuncs.com/google_containers#g"  /etc/containerd/config.toml

# Step 9:配置crictl
cat <<EOF | tee /etc/crictl.yaml
runtime-endpoint: unix:///run/containerd/containerd.sock
image-endpoint: unix:///run/containerd/containerd.sock
timeout: 10
debug: false
EOF

systemctl daemon-reload
systemctl restart  containerd
systemctl enable containerd

# 验证是否可用
crictl  pull nginx:alpine
crictl  rmi  nginx:alpine
crictl  images

初始化 Master 节点

方法一:提供配置文件初始化
1.生成并修改配置文件
# 生成配置文件
$ kubeadm config print init-defaults > kubeadm.yml

修改如下配置:

  • advertiseAddress:为控制切面地址,( Master 主机 IP )

  • criSocket:为 containerd 的 socket 文件地址

  • name: node 修改node为 master

  • imageRepository:阿里云镜像代理地址,否则拉取镜像会失败

  • kubernetesVersion:为 k8s 版本

注意:一定要配置镜像代理,否则会由于防火墙问题导致集群安装失败

修改后配置文件如下:

apiVersion: kubeadm.k8s.io/v1beta3
bootstrapTokens:
- groups:
  - system:bootstrappers:kubeadm:default-node-token
  token: abcdef.0123456789abcdef
  ttl: 24h0m0s
  usages:
  - signing
  - authentication
kind: InitConfiguration
localAPIEndpoint:
  # 控制切面的IP地址
  advertiseAddress: 172.16.90.111
  bindPort: 6443
nodeRegistration:
  # 容器运行时 socket 文件地址
  criSocket: unix:///var/run/containerd/containerd.sock
  imagePullPolicy: IfNotPresent
  # 控制面主机名,可省略
  name: master
  taints: 
  - effect: NoSchedule
    key: node-role.kubernetes.io/master
---
apiServer:
  timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta3
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns: {}
etcd:
  local:
    dataDir: /var/lib/etcd
# 镜像服务地址
imageRepository: registry.aliyuncs.com/google_containers
kind: ClusterConfiguration
# K8S 版本
kubernetesVersion: 1.25.4
networking:
  dnsDomain: cluster.local
  # service 的网段
  serviceSubnet: 10.96.0.0/12
scheduler: {}
---
kind: KubeletConfiguration
apiVersion: kubelet.config.k8s.io/v1beta1
cgroupDriver: systemd

2.初始化k8s集群
# 修改 /etc/containerd/config.toml,原来使用registry.k8s.io/pause:3.6
sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.8"
# 重启containerd
[root@master ~]# systemctl restart containerd.service 

# 查看所需镜像列表
$ kubeadm config images list --config kubeadm.yml
# 拉取镜像
$ kubeadm config images pull --config kubeadm.yml
# 根据配置文件启动 kubeadm 初始化 k8s
$ kubeadm init --config=kubeadm.yml --upload-certs --v=6
方法二:提供命令初始化
参数作用缺省配置
--apiserver-advertise-addressapiserver 绑定的 IPMaster 主机 IP
--apiserver-bind-portapiserver 监听的端口64436443
--cri-socketCRI socket 文件路径"unix:///var/run/containerd/containerd.sock"
--control-plane-endpoint控制面地址master_vip:6440
--image-repository选择拉取镜像的仓库k8s.gcr.ioregistry.aliyuncs.com/google_containers
--kubernetes-version选择K8S版本stable-11.24.2
--pod-network-cidr指定 pod 的网络10.244.0.0/16
--service-cidr指定service 的IP 范围10.96.0.0/1210.96.0.0/12
kubeadm init --apiserver-advertise-address=172.16.90.111 --apiserver-bind-port=6443 --cri-socket="unix:///var/run/containerd/containerd.sock" --image-repository registry.aliyuncs.com/google_containers  --kubernetes-version=1.24.2 --pod-network-cidr=10.244.0.0/16  --service-cidr=10.96.0.0/12

执行结果:

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 172.16.90.111:6443 --token abcdef.0123456789abcdef \
        --discovery-token-ca-cert-hash sha256:4ab2fe695b9917ac72d7ad4975605405d3f6a0731ef7f56ed627e79f93c8615b

说明 1:加入指令可以通过如下命令重复获取

$ kubeadm token create --print-join-command

说明 2:初始化失败可以用 reset 指令重置,解决问题后重新初始化

$ kubeadm reset

说明 3:查看日志

$ journalctl -f -u kubelet

说明 4:token 失效处理

# 重新生成token
$ kubeadm token create
abcdef.0123456789abcdef 

# 获取ca证书sha256编码hash值
$ openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
b615fccddcd4e80fc6f9c5e477bfc7a053b017660b73fdeccf89c559739664d7

# 将新的node节点加入到k8s集群中
kubeadm join node主机ip地址:6443 --token abcdef.0123456789abcdef \
    --discovery-token-ca-cert-hash sha256:b615fccddcd4e80fc6f9c5e477bfc7a053b017660b7

添加Worker节点

在Worker节点执行

[root@node1 ~]# kubeadm join 172.16.90.111:6443 --token abcdef.0123456789abcdef         --discovery-token-ca-cert-hash sha256:4ab2fe695b9917ac72d7ad4975605405d3f6a0731ef7f56ed627e79f93c8615b
[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.

安装网络插件

没有安装之前查看集群节点

[root@master ~]# kubectl get nodes
NAME     STATUS     ROLES           AGE     VERSION
master   NotReady   control-plane   5m8s    v1.25.4
node1    NotReady   <none>          2m15s   v1.25.4
node2    NotReady   <none>          73s     v1.25.4

下载,这里我们安装calico

[root@master ~]# curl https://docs.projectcalico.org/manifests/calico.yaml -O
[root@master ~]# vim calico.yaml 
...
            - name: CALICO_IPV4POOL_CIDR
              value: "10.244.0.0/16"
              
# Cluster type to identify the deployment type
  - name: CLUSTER_TYPE
    value: "k8s,bgp"
# 下方熙增新增
  - name: IP_AUTODETECTION_METHOD
    value: "interface=eth0"
去掉注释,修改。

执行:
[root@master ~]# kubectl apply -f calico.yaml

[root@master ~]# kubectl get node
NAME     STATUS   ROLES           AGE     VERSION
master   Ready    control-plane   24m     v1.25.4
node1    Ready    <none>          5m10s   v1.25.4
node2    Ready    <none>          4m59s   v1.25.4
[root@master ~]# kubectl get pods -A
NAMESPACE     NAME                                       READY   STATUS    RESTARTS   AGE
kube-system   calico-kube-controllers-798cc86c47-585pg   1/1     Running   0          108s
kube-system   calico-node-98484                          1/1     Running   0          108s
kube-system   calico-node-flsxv                          1/1     Running   0          108s
kube-system   calico-node-hz56c                          1/1     Running   0          108s
kube-system   coredns-c676cc86f-m25c7                    1/1     Running   0          24m
kube-system   coredns-c676cc86f-mqfz6                    1/1     Running   0          24m
kube-system   etcd-master                                1/1     Running   0          24m
kube-system   kube-apiserver-master                      1/1     Running   0          24m
kube-system   kube-controller-manager-master             1/1     Running   0          24m
kube-system   kube-proxy-hlbxb                           1/1     Running   0          5m13s
kube-system   kube-proxy-svsz2                           1/1     Running   0          24m
kube-system   kube-proxy-zh78z                           1/1     Running   0          5m2s
kube-system   kube-scheduler-master                      1/1     Running   0          24m

2.5 集群创建方式2:docker

docker安装

# 1 切换镜像源
[root@master ~]# wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo

sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /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

# 安装源里最新版本
$ yum install docker-ce

# 4 添加一个配置文件
# Docker在默认情况下使用的Cgroup Driver为cgroupfs,而kubernetes推荐使用systemd来代替cgroupfs
[root@master ~]# mkdir /etc/docker
[root@master ~]# cat <<EOF >  /etc/docker/daemon.json
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "registry-mirrors": ["https://kn0t2bca.mirror.aliyuncs.com"]
}
EOF

# 5 启动docker
[root@master ~]# systemctl restart docker
[root@master ~]# systemctl enable docker

# 6 检查docker状态和版本
[root@master ~]# docker version

cri-dockerd安装

# 下载
wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.2.3/cri-dockerd-0.2.3-3.el7.x86_64.rpm

# 安装
yum localinstall cri-dockerd-0.2.3-3.el7.x86_64.rpm

# 修改启动文件 /usr/lib/systemd/system/cri-docker.service

ExecStart=/usr/bin/cri-dockerd --network-plugin=cni --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.7

# 启动cri-docker
systemctl daemon-reload
systemctl start cri-docker
systemctl enable cri-docker
systemctl status cri-docker

集群初始化

kubeadm init --kubernetes-version=v1.25.4 --pod-network-cidr=10.224.0.0/16 --apiserver-advertise-address=172.16.90.111 --cri-socket unix:///var/run/cri-dockerd.sock --image-repository registry.aliyuncs.com/google_containers

添加worker节点

在Worker节点进行
[root@node1 ~]# kubeadm join 172.16.90.111:6443 --token ehjymf.tgsdgk6mol69kyyh \
	--discovery-token-ca-cert-hash sha256:c87c8af7daacbd8508864ff3c2039517ced0020069ca3365916c377f958e97c2 
 --cri-socket unix:///var/run/cri-dockerd.sock

注意:加入集群时需要添加 --cri-socket unix:///var/run/cri-dockerd.sock
集群删除节点
1、先查看一下这个node节点上的pod信息
[root@master ~]# kubectl get pod -o wide -A | grep node1

2、驱逐这个node节点上的pod
[root@master ~]# kubectl drain node1 --delete-local-data --force --ignore-daemonsets --delete-emptydir-data

3、删除这个node节点
[root@master ~]# kubectl delete nodes node1
node "node1" deleted

4、然后在node1这个节点上执行如下命令
[root@node1 ~]# kubeadm reset --cri-socket unix:///var/run/cri-dockerd.sock
W1128 13:58:30.514901   15032 preflight.go:55] [reset] WARNING: Changes made to this host by 'kubeadm init' or 'kubeadm join' will be reverted.
[reset] Are you sure you want to proceed? [y/N]: y

5、节点加入集群
[root@node1 ~]# kubeadm join 172.16.90.111:6443 --token k67zgc.26afadpb4g48aaz5 --discovery-token-ca-cert-hash sha256:c87c8af7daacbd8508864ff3c2039517ced0020069ca3365916c377f958e97c2 --cri-socket unix:///var/run/cri-dockerd.sock

安装网络插件

没有安装之前查看集群节点

[root@master ~]# kubectl get nodes
NAME     STATUS     ROLES           AGE     VERSION
master   NotReady   control-plane   10m     v1.25.4
node1    NotReady   <none>          6s      v1.25.4
node2    NotReady   <none>          8m24s   v1.25.4

下载,这里我们安装calico

[root@master ~]# curl https://docs.projectcalico.org/manifests/calico.yaml -O
[root@master ~]# vim calico.yaml 
...
            - name: CALICO_IPV4POOL_CIDR
              value: "10.244.0.0/16"
              
# Cluster type to identify the deployment type
  - name: CLUSTER_TYPE
    value: "k8s,bgp"
# 下方熙增新增
  - name: IP_AUTODETECTION_METHOD
    value: "interface=eth0"
去掉注释,修改。

执行:
[root@master ~]# kubectl apply -f calico.yaml

2.6 集群创建方式3:cri - o 

安装cri-o

所有节点安装配置cri-o

VERSION=1.25
curl -L -o /etc/yum.repos.d/devel:kubic:libcontainers:stable.repo \
https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/CentOS_7/devel:kubic:libcontainers:stable.repo

curl -L -o /etc/yum.repos.d/devel:kubic:libcontainers:stable:cri-o:${VERSION}.repo \
    https://download.opensuse.org/repositories/devel:kubic:libcontainers:stable:cri-o:${VERSION}/CentOS_7/devel:kubic:libcontainers:stable:cri-o:${VERSION}.repo

yum install cri-o -y

# 修改crio配置文件
[root@master ~]# grep "pause_image =" /etc/crio/crio.conf 
pause_image = "registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.7"
[root@master ~]# grep "insecure_registries =" -A 2 /etc/crio/crio.conf 
insecure_registries = [
   "docker.mirrors.ustc.edu.cn","dockerhub.azk8s.cn","hub-mirror.c.163.com"
]

systemctl daemon-reload
systemctl start crio
systemctl enable crio

修改/etc/sysconfig/kubelet

# more /etc/sysconfig/kubelet 
KUBELET_EXTRA_ARGS="--container-runtime=remote --cgroup-driver=systemd --container-runtime-endpoint='unix:///var/run/crio/crio.sock' --runtime-req
uest-timeout=5m"

# systemctl daemon-reload
# systemctl restart kubelet.service

集群初始化

下面对集群进行初始化,并将节点加入到集群中

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

# 创建集群
kubeadm init --kubernetes-version=v1.25.4 --pod-network-cidr=10.224.0.0/16 \
--apiserver-advertise-address=172.16.90.111 \
--service-cidr=10.96.0.0/12 \
--cri-socket unix:///var/run/crio/crio.sock \
--image-repository registry.aliyuncs.com/google_containers

# 创建必要文件
[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

下面的操作只需要在node节点上执行即可

# 将node节点加入集群
[root@master ~]# kubeadm join 172.16.90.111:6443 --token z1qcpt.8o1346u2ksaml3ur \
	--discovery-token-ca-cert-hash sha256:2a9e48f4f19e0154fb4427c1f30445c46aab1c9c45a68267375869696416969b 

# 查看集群状态 此时的集群状态为NotReady,这是因为还没有配置网络插件
[root@master ~]# kubectl get node
NAME     STATUS   ROLES           AGE    VERSION
master   Ready    control-plane   101s   v1.25.4
node1    Ready    <none>          28s    v1.25.4
node2    Ready    <none>          23s    v1.25.4

检查集群状态

[root@master ~]# kubectl get cs
Warning: v1 ComponentStatus is deprecated in v1.19+
NAME                 STATUS      MESSAGE                                                                                       ERROR
scheduler            Unhealthy   Get "http://127.0.0.1:10251/healthz": dial tcp 127.0.0.1:10251: connect: connection refused   
controller-manager   Healthy     ok                                                                                            
etcd-0               Healthy     {"health":"true","reason":""}   

解决方法:

[root@master ~]# cd /etc/kubernetes/manifests/
修改:kube-scheduler.yaml  注释port=0
#- --port=0

重启kubelet服务
[root@master ~]# kubectl get cs
Warning: v1 ComponentStatus is deprecated in v1.19+
NAME                 STATUS    MESSAGE                         ERROR
scheduler            Healthy   ok                              
controller-manager   Healthy   ok                              
etcd-0               Healthy   {"health":"true","reason":""}  

安装网络插件

kubernetes支持多种网络插件,比如flannel、calico、canal等等,任选一种使用即可,本次选择calico

下面操作依旧只在master节点执行即可,插件使用的是DaemonSet的控制器,它会在每个节点上都运行

下载,这里我们安装calico

[root@master ~]# curl https://docs.projectcalico.org/manifests/calico.yaml -O
[root@master ~]# vim calico.yaml 
...
            - name: CALICO_IPV4POOL_CIDR
              value: "10.244.0.0/16"
              
# Cluster type to identify the deployment type
  - name: CLUSTER_TYPE
    value: "k8s,bgp"
# 下方熙增新增
  - name: IP_AUTODETECTION_METHOD
    value: "interface=eth0"
去掉注释,修改。

执行:
[root@master ~]# kubectl apply -f calico.yaml

 至此,kubernetes的集群环境搭建完成

Kubernetes更换网络CNI插件
卸载插件
# 删除flannel的pod
# 使用一开始创建pod时同样的yaml文件
kubectl delete -f kube-flannel.yml

# 在集群各节点清理flannel网络的残留文件
ifconfig cni0 down
ip link delete cni0
ifconfig flannel.1 down
ip link delete flannel.1
rm -rf /var/lib/cni
rm -rf /etc/cni/net.d

然后部署新插件

部署网络插件calico

下载calico.yml
[root@master ~]# wget https://docs.projectcalico.org/manifests/calico.yaml --no-check-certificate
修改CALICO_IPV4POOL_CIDR为自定义地址

该地址与kubeadm init指定pod-network-cidr一致

[root@master ~]# vim calico.yaml 
...
            - name: CALICO_IPV4POOL_CIDR
              value: "10.244.0.0/16"
              
# Cluster type to identify the deployment type
  - name: CLUSTER_TYPE
    value: "k8s,bgp"
# 下方熙增新增
  - name: IP_AUTODETECTION_METHOD
    value: "interface=eth0"
去掉注释,修改。
安装calico网络插件
# 如果已经部署了flannel,先删除
[root@master ~]# kubectl delete -f kube-flannel.yml 
Warning: policy/v1beta1 PodSecurityPolicy is deprecated in v1.21+, unavailable in v1.25+
podsecuritypolicy.policy "psp.flannel.unprivileged" deleted
clusterrole.rbac.authorization.k8s.io "flannel" deleted
clusterrolebinding.rbac.authorization.k8s.io "flannel" deleted
serviceaccount "flannel" deleted
configmap "kube-flannel-cfg" deleted
daemonset.apps "kube-flannel-ds" deleted

# 部署calico
[root@master ~]# kubectl apply -f calico.yaml 
configmap/calico-config created
customresourcedefinition.apiextensions.k8s.io/bgpconfigurations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/bgppeers.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/blockaffinities.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/caliconodestatuses.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/clusterinformations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/felixconfigurations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/globalnetworkpolicies.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/globalnetworksets.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/hostendpoints.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ipamblocks.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ipamconfigs.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ipamhandles.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ippools.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ipreservations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/kubecontrollersconfigurations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/networkpolicies.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/networksets.crd.projectcalico.org created
clusterrole.rbac.authorization.k8s.io/calico-kube-controllers created
clusterrolebinding.rbac.authorization.k8s.io/calico-kube-controllers created
clusterrole.rbac.authorization.k8s.io/calico-node created
clusterrolebinding.rbac.authorization.k8s.io/calico-node created
daemonset.apps/calico-node created
serviceaccount/calico-node created
deployment.apps/calico-kube-controllers created
serviceaccount/calico-kube-controllers created
Warning: policy/v1beta1 PodDisruptionBudget is deprecated in v1.21+, unavailable in v1.25+; use policy/v1 PodDisruptionBudget
poddisruptionbudget.policy/calico-kube-controllers created

[root@master ~]# kubectl get pods -n kube-system 
NAME                                      READY   STATUS    RESTARTS      AGE
calico-kube-controllers-958545d87-fgvk8   1/1     Running   0             92s
calico-node-g7584                         1/1     Running   0             92s
calico-node-nqbbk                         0/1     Running   0             92s
calico-node-vw8hx                         0/1     Running   0             92s
coredns-78fcd69978-4fx9p                  1/1     Running   1 (22h ago)   23h
coredns-78fcd69978-fkbjx                  1/1     Running   1 (22h ago)   23h
etcd-master                               1/1     Running   1 (22h ago)   23h
kube-apiserver-master                     1/1     Running   1 (22h ago)   23h
kube-controller-manager-master            1/1     Running   1 (79s ago)   21h
kube-flannel-ds-amd64-gmdz7               1/1     Running   1 (22h ago)   22h
kube-flannel-ds-amd64-rbjft               1/1     Running   1 (22h ago)   22h
kube-flannel-ds-amd64-wmx6h               1/1     Running   1 (22h ago)   22h
kube-proxy-87b94                          1/1     Running   0             35m
kube-proxy-f9lms                          1/1     Running   0             35m
kube-proxy-hhtct                          1/1     Running   0             35m
kube-scheduler-master                     1/1     Running   1 (22h ago)   22h

补充:kubectl命令自动补全

例:输入kubectl cr(tab键自动联想命令create)
[root@master ~]# yum install -y bash-completion 
[root@master ~]# source /usr/share/bash-completion/bash_completion
[root@master ~]# source <(kubectl completion bash)
[root@master ~]# echo "source <(kubectl completion bash)" >> ~/.bashrc

3.服务部署

接下来在kubernetes集群中部署一个nginx程序,测试下集群是否在正常工作。

# 部署nginx
[root@master ~]# kubectl create deployment nginx --image=nginx:1.14-alpine

# 暴露端口
[root@master ~]# kubectl expose deployment nginx --port=80 --type=NodePort

# 查看服务状态
[root@master ~]# kubectl get pods,service
NAME                         READY   STATUS    RESTARTS   AGE
pod/nginx-86c57db685-fdc2k   1/1     Running   0          18m

NAME                 TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
service/kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP        82m
service/nginx        NodePort    10.104.121.45   <none>        80:30073/TCP   17m

# 4 最后在电脑上访问下部署的nginx服务

4.Rancher容器云管理平台

https://docs.ranchermanager.rancher.io/zh/v2.6/getting-started/overview

4.1 什么是rancher

  Rancher是一个开源软件平台,使组织能够在生产中运行管理Docker和Kubernetes。使用Rancher,组织不再需要使用一套独特的开源技术从头开始构建容器服务平台。Rancher提供了管理生产中的容器所需的整个软件堆栈

4.2 充分发挥K8s的潜力

  Kubernetes并非没有挑战,对一个集群的严格控制可能会给运营团队带来压力。关注一个以上的问题会让他们不知所措。Kubernetes很容易为您的软件引入过多的复杂性。随着越来越多的供应商围绕Kubernetes部署解决方案,避免锁定只会变得更加困难。 Rancher解决了这些问题。它开箱即用地部署PrometheusGrafana以便对集群和工作负载的指标进行详细的可视化。它使新Kubernetes用户部署工作负载变得非常简单,同时仍然保留所有传统的访问通道供高级用户使用。它在一个集中身份验证提供者下统一管理每个集群。它将最佳实践转化为简单的实践,这将成为更安全的系统、更高效的团队,以及企业转向市场的灵活性。

4.3 基础架构流程

  Rancher以linux主机的形式可以从任何公有/私有云中获取原始计算资源,每个linux主机可以是虚拟机/物理机。 Rancher实现了可移植的基础架构服务层,专门为容器话应用程序提供动力,Rancher基础架构服务包括网络,存储、负载均衡、DNS和安全性。Rancher基础结构服务通常本身是作为容器部署,因此同一Rancher基础结构服务可以在来自任何云、任何linux主机上运行

4.4 容器编排和调度

  许多用户选择使用容器编排调度框架来运行容器话的应用程序,Rancher包括当前所有留下的容器编排和调度框架的发行版,包括Docker SwarmKubernetesMesos同一个用户可以创建多个Swarm或Kubernetes集群,然后,他们可以使用本机Swarm或Kubernetes和Mesos集群

4.5 应用目录

  Rancher用户只需单击以下按钮,即可从应用程序目录中部署整个多容器集群应用程序,当新版本的应用程序可用时,用户可以管理已部署的应用程序并执行全自动升级,Rancher维护由Rancher社区贡献的流行应用程序组成的公共目录。Rancher用户可以创建自己的私有目录

4.6 企业级控制

  Rancher支持灵活的用户身份验证差价,并与Active Directory,LDAP和GitHub进行了预先构建的用户身份验证集成。Rancher在环境级别支持基于角色的访问控制(RBAC),允许用户和组共享或拒绝对开发和生产环境的访问。

4.7 为什么使用rancher

  Rancher是供采用容器的团队使用的完整软件堆栈。它解决了在任何基础架构上管理多个Kubernetes集群的运营和安全挑战,同时为DevOps团队提供了用于运行容器化工作负载的集成工具

用户不需要深入了解kubernetes概念就可以使用rancher,rancher包含应用商店,支持一键部署helm和compose模板。rancher通过各种云、本地生态系统产品认证,其中包括安全工具,监控系统,容器仓库以及存储和网络驱动程序,下图说明rancher在IT和DevOps组织中扮演的角色,每个团队都会在他们选择的公共云或私有云上部署应用

4.8 Rancher的主要组件和功能图示

4.9 新的功能

内置CI/CD;

告警和日志收集;

多集群管理;

rancher kubernetes engine(RKE);

与云Kubernetes服务(如GKE,EKS和AKS)集成;

5.单节点部署并管理K8s

流程:环境---》安装docker---》安装rancher---》部署或导入k8s

本文使用 Docker 将 Rancher 安装到单个节点中

作用IP地址操作系统配置
Master172.16.90.111Centos7.9 基础设施服务器2颗CPU 4G内存 50G硬盘
Node1172.16.90.112Centos7.9 基础设施服务器2颗CPU 4G内存 50G硬盘
Node2172.16.90.113Centos7.9 基础设施服务器2颗CPU 4G内存 50G硬盘
rancherserver172.16.90.116Centos7.9 基础设施服务器2颗CPU 4G内存 50G硬盘

 停止防火墙、禁用SELinux,配置时间同步,主机名解析。

5.1 dcoker-ce 安装

# wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# yum -y install docker-ce

配置docker加速器
# mkdir -p /etc/docker
# tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://rvq9mjyt.mirror.aliyuncs.com"]
}
EOF
# systemctl daemon-reload
# systemctl enable --now docker

5.2 rancher 安装

[root@rancherserver ~]# docker pull rancher/rancher:v2.6.7
[root@rancherserver ~]# mkdir -p /opt/data/rancher_data
[root@rancherserver ~]# docker run -d --privileged -p 80:80 -p 443:443 -v /opt/data/rancher_data:/var/lib/rancher --restart=always --name rancher rancher/rancher:v2.6.7
[root@rancherserver ~]# docker ps
CONTAINER ID   IMAGE                    COMMAND           CREATED        STATUS        PORTS                                                                      NAMES
fdc7018ccb66   rancher/rancher:v2.6.7   "entrypoint.sh"   15 hours ago   Up 15 hours   0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp   rancher

5.3 登录web端导入

5.3.1 登录并设置密码

https://172.16.90.116/login

 查询密码
[root@rancherserver ~]# docker logs rancher 2>&1 | grep "Bootstrap Password:"
2022/11/28 09:42:26 [INFO] Bootstrap Password: mr7t6xtmfcsgr8nkfnmtxlhhv7fqnjhp5rg87xt7lxcfjg9fmkxzmw
 修改密码

5.3.2 创建集群

 可以先调成中文再点击添加集群

 

[root@master ~]# curl --insecure -sfL https://172.16.90.116/v3/import/7c4n5kkbz7jwjk4fpf2lsp5t2wd9lmrwfbk8jhvg9jgmwxj6h6ndqs_c-m-zvqtgm4h.yaml | kubectl apply -f -

大概3-5分钟,检查,三个以cattle开头的名称空间,导入成功
[root@master ~]# kubectl get ns
NAME                          STATUS   AGE
cattle-fleet-system           Active   15h
cattle-impersonation-system   Active   15h
cattle-system                 Active   15h
default                       Active   19h
dev                           Active   17h
kube-node-lease               Active   19h
kube-public                   Active   19h
kube-system                   Active   19h
local                         Active   15h
[root@master ~]# 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值