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地址 | 操作系统 | 配置 |
---|---|---|---|
Master | 172.16.90.111 | Centos7.9 基础设施服务器 | 2颗CPU 4G内存 50G硬盘 |
Node1 | 172.16.90.112 | Centos7.9 基础设施服务器 | 2颗CPU 4G内存 50G硬盘 |
Node2 | 172.16.90.113 | Centos7.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-address | apiserver 绑定的 IP | Master 主机 IP | |
--apiserver-bind-port | apiserver 监听的端口 | 6443 | 6443 |
--cri-socket | CRI socket 文件路径 | "unix:///var/run/containerd/containerd.sock" | |
--control-plane-endpoint | 控制面地址 | master_vip:6440 | |
--image-repository | 选择拉取镜像的仓库 | k8s.gcr.io | registry.aliyuncs.com/google_containers |
--kubernetes-version | 选择K8S版本 | stable-1 | 1.24.2 |
--pod-network-cidr | 指定 pod 的网络 | 10.244.0.0/16 | |
--service-cidr | 指定service 的IP 范围 | 10.96.0.0/12 | 10.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容器云管理平台
4.1 什么是rancher
Rancher是一个开源软件平台,使组织能够在生产中运行和管理Docker和Kubernetes。使用Rancher,组织不再需要使用一套独特的开源技术从头开始构建容器服务平台。Rancher提供了管理生产中的容器所需的整个软件堆栈。
4.2 充分发挥K8s的潜力
Kubernetes并非没有挑战,对一个集群的严格控制可能会给运营团队带来压力。关注一个以上的问题会让他们不知所措。Kubernetes很容易为您的软件引入过多的复杂性。随着越来越多的供应商围绕Kubernetes部署解决方案,避免锁定只会变得更加困难。 Rancher解决了这些问题。它开箱即用地部署Prometheus和Grafana,以便对集群和工作负载的指标进行详细的可视化。它使新Kubernetes用户部署工作负载变得非常简单,同时仍然保留所有传统的访问通道供高级用户使用。它在一个集中身份验证提供者下统一管理每个集群。它将最佳实践转化为简单的实践,这将成为更安全的系统、更高效的团队,以及企业转向市场的灵活性。
4.3 基础架构流程
Rancher以linux主机的形式可以从任何公有/私有云中获取原始计算资源,每个linux主机可以是虚拟机/物理机。 Rancher实现了可移植的基础架构服务层,专门为容器话应用程序提供动力,Rancher基础架构服务包括网络,存储、负载均衡、DNS和安全性。Rancher基础结构服务通常本身是作为容器部署,因此同一Rancher基础结构服务可以在来自任何云、任何linux主机上运行
4.4 容器编排和调度
许多用户选择使用容器编排和调度框架来运行容器话的应用程序,Rancher包括当前所有留下的容器编排和调度框架的发行版,包括Docker Swarm,Kubernetes和Mesos,同一个用户可以创建多个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地址 | 操作系统 | 配置 |
---|---|---|---|
Master | 172.16.90.111 | Centos7.9 基础设施服务器 | 2颗CPU 4G内存 50G硬盘 |
Node1 | 172.16.90.112 | Centos7.9 基础设施服务器 | 2颗CPU 4G内存 50G硬盘 |
Node2 | 172.16.90.113 | Centos7.9 基础设施服务器 | 2颗CPU 4G内存 50G硬盘 |
rancherserver | 172.16.90.116 | Centos7.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 ~]#