安装Kubernetes(k8s)教程

借鉴文章:
https://www.cnblogs.com/Sunzz/p/15184167.html
https://www.yuque.com/xuxiaowei-com-cn/gitlab-k8s/k8s-install

一、安装环境说明

硬件要求

内存:2GB或更多RAM

CPU: 2核CPU或更多CPU

硬盘: 30GB或更多

二、环境准备

1.关闭防火墙和selinux

关闭防火墙

systemctl stop firewalld && systemctl disable firewalld && iptables -F

关闭selinux

sed  -i  's/enforcing/disabled/'  /etc/selinux/config && setenforce  0

2. 关闭swap分区

临时关闭

swapoff -a

永久关闭swap

sed -i 's/.*swap.*/#&/' /etc/fstab

三、安装docker

1.配置yum源

#wget工具从阿里云的 docker-ce 镜像源地址下载 docker-ce.repo 文件,并将其保存到 /etc/yum.repos.d/ 目录下
yum install wget -y 
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo

2. 安装docker

#系统将自动从阿里云 docker-ce 镜像源安装最新版本的 Docker CE 工具
yum  install  docker-ce docker-ce-cli -y

3.编辑docker配置文件

mkdir /etc/docker/ 
cat > /etc/docker/daemon.json << EOF
{
"registry-mirrors": ["https://gqs7xcfd.mirror.aliyuncs.com","https://hub-mirror.c.163.com"],
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2"
}
EOF
#重新加载配置文件
systemctl daemon-reload

4.启动docker服务

systemctl daemon-reload && systemctl enable docker && systemctl start docker

5.可以使用 yum 包管理器来安装指定版本的 Docker

  1. 移除旧版本的 Docker:
yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine
  1. 列出所有docker版本
yum list docker-ce.x86_64 --showduplicates |sort
  1. 安装所需版本的 Docker:
yum install docker-ce-20.10.7 docker-ce-cli-20.10.7 containerd.io
  1. 启动docker服务
systemctl start docker

四、安装kubeadm,kubelet和kubectl

1.添加k8s镜像仓库

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
# 是否检查 gpg 签名文件,下载最新版本可能签名校验无法通过,修改为0则不校验
gpgcheck=0
# 是否检查 gpg 签名文件,下载最新版本可能签名校验无法通过,修改为0则不校验
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg

EOF

2.设置内核参数,优化 Kubernetes 群集的网络性能

# 设置所需的 sysctl 参数,参数在重新启动后保持不变
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables  = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward                 = 1

EOF

# 应用 sysctl 参数而不重新启动
sudo sysctl --system

3.安装指定版本的kubeadm,kubelet,kubectl

# 如果你看到有人说 node 节点不需要安装 kubectl,其实这种说法是错的,kubectl 会被当做依赖安装,如果安装过程没有指定 kubectl 的版本,则会安装最新版的 kubectl,可能会导致程序运行异常
# 列出所有kubelet kubeadm kubectl 版本
# yum --showduplicates list kubelet --nogpgcheck
# yum --showduplicates list kubeadm --nogpgcheck
# yum --showduplicates list kubectl --nogpgcheck
yum install -y kubelet-1.25.3-0 kubeadm-1.25.3-0 kubectl-1.25.3-0 --disableexcludes=kubernetes --nogpgcheck

--disableexcludes=kubernetes 选项用于禁用 yumexclude 插件,以确保 Kubernetes 仓库中的所有软件包都能被 yum 正常下载和安装。这个选项通常在启用了 exclude 插件导致 Kubernetes 应用无法正常工作的情况下使用。

--nogpgcheck 选项用于禁止 yum 在下载软件包时对 GPG 签名进行验证。默认情况下,yum 每次下载软件包时都会检查软件包的签名,以确保软件包未被篡改或植入恶意代码。但有时,由于网络问题或其他原因,软件包的 GPG 签名无法验证通过,这就需要使用 --nogpgcheck 选项来跳过 GPG 签名验证,以确保软件包能够被正确安装。

4.设置开机自启

#重新加载了 systemd 配置文件
systemctl daemon-reload
#启动kubelet
sudo systemctl restart kubelet
#开机自启kubelet
sudo systemctl enable kubelet

5.查看kubelet日志

# k8s 未初始化时,kubelet 可能无法启动
journalctl -xefu kubelet

6.查看kubelet状态

# k8s 未初始化时,kubelet 可能无法启动
systemctl status kubelet

五、部署Kubernetes Master节点

1.初始化

kubeadm init --image-repository=registry.aliyuncs.com/google_containers
# 指定集群的IP
# kubeadm init --image-repository=registry.aliyuncs.com/google_containers --apiserver-advertise-address=192.168.29.141
#kubeadm init \
  --kubernetes-version 1.25.3 \
  --apiserver-advertise-address=0.0.0.0 \
  --service-cidr=10.96.0.0/16 \
  --pod-network-cidr=10.245.0.0/16 \
  --image-repository registry.aliyuncs.com/google_containers
# 初始化失败后,可进行重置,重置命令:kubeadm reset

# 执行成功后,会出现类似下列内容:
# kubeadm join 192.168.29.141:6443 --token zvrmgc.aicmw5ytnk7p1hs6 \
	--discovery-token-ca-cert-hash sha256:5474595223ac9b475bff69987421ea9daf4692768e1891365a89f8dc1ecaf764 	

参数说明

–kubernetes-version v1.25.3 指定版本
–apiserver-advertise-address 为通告给其它组件的IP,一般应为master节点的IP地址
–service-cidr 指定service网络,不能和node网络冲突
–pod-network-cidr 指定pod网络,不能和node网络、service网络冲突
–image-repository registry.aliyuncs.com/google_containers 指定镜像源,由于默认拉取镜像地址k8s.gcr.io国内无法访问,这里指定阿里云镜像仓库地址。
如果k8s版本比较新,可能阿里云没有对应的镜像,就需要自己从其它地方获取镜像了。
–control-plane-endpoint 标志应该被设置成负载均衡器的地址或 DNS 和端口(可选)

20230617141412.png

2. 配置kubectl

  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config

3. 查看节点信息

kubectl get nodes
#此时只能看到master节点,等待其他节点加入进来后即可看到。
#可以看到STATUS状态都是NotReady,这是因为确实网络插件导致的,等安装好网络插件就好了

4. 将从节点加入集群(可选)

kubeadm join 192.168.29.141:6443 --token zvrmgc.aicmw5ytnk7p1hs6 \
	--discovery-token-ca-cert-hash sha256:5474595223ac9b475bff69987421ea9daf4692768e1891365a89f8dc1ecaf764

5. 控制面板

#获取所有 Kubernetes 集群中运行的 Pod
kubectl get pods --all-namespaces -o wide

--all-namespaces 选项表示获取所有命名空间中的 Pod,而不仅仅是默认命名空间;-o wide 选项则表示以宽松格式(wide format)输出结果。

#获取 Kubernetes 集群中所有节点
kubectl get nodes -o wide

-o wide 选项表示以宽松格式(wide format)输出结果,该格式包含了更多的信息,例如节点的名称、IP 地址、所在区域、所在可用性区域、节点状态、内存和 CPU 使用情况等。

6. 控制面板(master)作为node使用(去污)

#**查看当前软件的去污的命令参数**
kubectl get no -o yaml | grep taint -A 10
# 1.24.0 版本需要使用下列命令去污
# kubectl taint nodes --all node-role.kubernetes.io/master-

六、安装插件

配置网络,选择 Calico 配置

# 下载
wget --no-check-certificate https://projectcalico.docs.tigera.io/archive/v3.20/manifests/calico.yaml
# 修改 calico.yaml 文件
vim calico.yaml
# 在 - name: CLUSTER_TYPE 下方添加如下内容
- name: CLUSTER_TYPE
  value: "k8s,bgp"
  # 下方为新增内容
- name: IP_AUTODETECTION_METHOD
  value: "interface=网卡名称"


# INTERFACE_NAME=ens33
# sed -i '/k8s,bgp/a \            - name: IP_AUTODETECTION_METHOD\n              value: "interface=INTERFACE_NAME"' calico.yaml
# sed -i "s#INTERFACE_NAME#$INTERFACE_NAME#g" calico.yaml
# 配置网络
kubectl apply -f calico.yaml

七、测试

创建 nginx 服务

cat > nginx.yaml << EOF
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.23.2
        ports:
        - containerPort: 80

EOF

cat nginx.yaml

kubectl apply -f nginx.yaml

# 编辑
# kubectl edit deployment nginx-deployment
kubectl get pods --all-namespaces -o wide

CentOS 命令自动补充

1、安装 bash-completion

yum install -y bash-completion

2、拷贝 kubernetes 的自动补全脚本到系统补全目录中

source <(kubectl completion bash)
echo "source <(kubectl completion bash)" >> ~/.bashrc

3、重新加载环境变量,使设置生效

source ~/.bashrc

Token 相关命令

1、 控制平面节点上运行以下命令来获取令牌

kubeadm token list

2、 默认情况下,令牌会在 24 小时后过期,可以通过在控制平面节点上运行以下命令来创建新令牌

kubeadm token create

相关命令

1、 查看更多信息

 -o wide

2、 查看所有命名空间

--all-namespaces

3、 查看指定命名空间

-n 命名空间

4、查看所有 pod

kubectl get pods --all-namespaces -o wide

5、查看pod描述

kubectl -n 命名空间 describe pod 名称

6、删除pod

kubectl -n 命名空间 delete pod 名称

7、进入pod

kubectl exec -it pod名称 bash

8、查看 Service Account

#查看所有 Service Account
kubectl get sa --all-namespaces
#查看指定命名空间 Service Account
kubectl -n 命名空间 get sa

9、查看pv

kubectl get pv

10、查看pvc

kubectl get pvc

11、查看角色绑定

kubectl get rolebinding --all-namespaces -o wide

拆卸Kubernetes(k8s)

拆卸docker

yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine

拆卸podman

yum erase podman buildah

拆卸k8s

yum remove -y kubelet kubeadm kubectl
kubeadm reset -f
modprobe -r ipip
lsmod
rm -rf ~/.kube/
rm -rf /etc/kubernetes/
rm -rf /etc/systemd/system/kubelet.service.d
rm -rf /etc/systemd/system/kubelet.service
rm -rf /usr/bin/kube*
rm -rf /etc/cni
rm -rf /opt/cni
rm -rf /var/lib/etcd
rm -rf /var/etcd

Q.E.D.