侧边栏壁纸
博主头像
DJ's Blog博主等级

行动起来,活在当下

  • 累计撰写 133 篇文章
  • 累计创建 51 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

【Kubernetes】Kubeadm1.23.14版本安装和配置

Administrator
2023-01-15 / 0 评论 / 0 点赞 / 91 阅读 / 13403 字

版本统一

kubeadm:v1.23.14 
kubelet:v1.23.14  
kubectl:v1.23.14 
---
k8s.gcr.io/kube-apiserver:v1.23.14
k8s.gcr.io/kube-controller-manager:v1.23.14
k8s.gcr.io/kube-scheduler:v1.23.14
k8s.gcr.io/kube-proxy:v1.23.14
k8s.gcr.io/pause:3.6
k8s.gcr.io/etcd:3.5.5-0
k8s.gcr.io/coredns/coredns:v1.8.6
---
calico:v3.20
---
docker:v20.10.7

集群规划

节点IP 主机名 角色
172.24.253.248 k8s-master master
172.24.133.28 k8s-node1 worker
172.24.133.29 k8s-node2 worker

系统基础前提配置

在三个节点上都要操作

  • 更新并安装依赖
yum -y update
yum install -y conntrack ipvsadm ipset jq sysstat curl iptables libseccomp
  • 关闭防火墙
systemctl stop firewalld && systemctl disable firewalld
  • 关闭selinux
setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
  • 关闭swap
swapoff -a
sed -i '/swap/s/^\(.*\)$/#\1/g' /etc/fstab
  • 配置iptables的ACCEPT规则
iptables -F && iptables -X && iptables -F -t nat && iptables -X -t nat && iptables -P FORWARD ACCEPT
  • 设置系统参数
cat <<EOF >  /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system

修改集群节点的host文件

  • 修改172.24.253.248节点的主机名
sudo hostnamectl set-hostname k8s-master
  • 修改172.24.133.28节点的主机名
sudo hostnamectl set-hostname k8s-node1
  • 修改172.24.133.29节点的主机名
sudo hostnamectl set-hostname k8s-node2
  • 三个节点上都操作
vim /etc/hosts
172.24.253.248   k8s-master
172.24.133.28    k8s-node1
172.24.133.29    k8s-node2

安装Docker

在三个节点上都要操作

  • 安装必要的依赖
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
  • 设置docker仓库
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
  • 设置阿里云镜像仓库
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
  • 安装docker
sudo yum install -y docker-ce-20.10.7 docker-ce-cli-20.10.7 containerd.io
  • 启动docker,并设置开机启动
sudo systemctl start docker && sudo systemctl enable docker

安装kubeadm,kubelet和kubectl

在三个节点上都要操作

  • 配置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 list kubeadm --showduplicates | sort -r
  • 安装kubectl
yum install -y kubectl-1.23.14
  • 安装kubelet
yum install -y kubelet-1.23.14
  • 安装kubeadm
yum install -y kubeadm-1.23.14
  • 查询安装
yum list installed | grep kube
  • docker和k8s设置同一个cgroup
vim /etc/docker/daemon.json
{
    "exec-opts": ["native.cgroupdriver=systemd"]
}
systemctl restart docker
sed -i "s/cgroup-driver=systemd/cgroup-driver=cgroupfs/g" /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
systemctl daemon-reload
systemctl enable kubelet && systemctl start kubelet

下载镜像

  • 查看kubeadm使用的镜像
kubeadm config images list
k8s.gcr.io/kube-apiserver:v1.23.14
k8s.gcr.io/kube-controller-manager:v1.23.14
k8s.gcr.io/kube-scheduler:v1.23.14
k8s.gcr.io/kube-proxy:v1.23.14
k8s.gcr.io/pause:3.6
k8s.gcr.io/etcd:3.5.5-0
k8s.gcr.io/coredns/coredns:v1.8.6
  • 创建kubeadm.sh脚本,用于拉取镜像/打tag/删除原有镜像
vim kubeadm-pull-image.sh
#!/bin/bash

set -e

KUBE_VERSION=v1.23.14
KUBE_PAUSE_VERSION=3.6
ETCD_VERSION=3.5.5-0

GCR_URL=k8s.gcr.io
ALIYUN_URL=registry.cn-hangzhou.aliyuncs.com/jack-kubernetes

images=(kube-proxy:${KUBE_VERSION}
kube-scheduler:${KUBE_VERSION}
kube-controller-manager:${KUBE_VERSION}
kube-apiserver:${KUBE_VERSION}
pause:${KUBE_PAUSE_VERSION}
etcd:${ETCD_VERSION})

for imageName in ${images[@]} ; do
  docker pull $ALIYUN_URL/$imageName
  docker tag  $ALIYUN_URL/$imageName $GCR_URL/$imageName
  docker rmi $ALIYUN_URL/$imageName
done
  • 脚本添加可执行权限
chmod 775 kubeadm-pull-image.sh
  • 运行脚本
sh ./kubeadm-pull-image.sh
  • 拉取coredns镜像
docker pull registry.cn-hangzhou.aliyuncs.com/jack-kubernetes/coredns:v1.8.6
docker tag registry.cn-hangzhou.aliyuncs.com/jack-kubernetes/coredns:v1.8.6 k8s.gcr.io/coredns/coredns:v1.8.6
docker rmi registry.cn-hangzhou.aliyuncs.com/jack-kubernetes/coredns:v1.8.6
  • 查看镜像
docker images

初始化master

在k8s-master节点上执行

  • 使用kubeadm init命令初始化master
kubeadm init --kubernetes-version=1.23.14 --apiserver-advertise-address=172.24.253.248 --pod-network-cidr=10.244.0.0/16
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
  • 查看是否成功
kubectl cluster-info
kubectl get pods -n kube-system
  • 健康检查
curl -k https://localhost:6443/healthz

kube join

  • k8s-node1和k8s-node2两个节点上运行
kubeadm join 172.24.253.248:6443 --token v61qjw.l8l1lnn4q0wjnea4 \
    --discovery-token-ca-cert-hash sha256:750922612646bf4dda3640cfe3bc90145a52a59c89a32742290f22151b31576a

此命令来自上面一步初始化master成功之后输出的

  • 在k8s-master节点上检查集群信息
kubectl get nodes
NAME         STATUS   ROLES    AGE   VERSION
k8s-master   Ready    master   36h   v1.23.14
k8s-node1    Ready    <none>   36h   v1.23.14
k8s-node2    Ready    <none>   36h   v1.23.14

部署calico网络插件

  • 提前拉取calico镜像
docker pull docker.io/calico/kube-controllers:v3.20.3
docker pull docker.io/calico/pod2daemon-flexvol:v3.20.3
docker pull docker.io/calico/node:v3.20.3
docker pull docker.io/calico/cni:v3.20.3
  • 在k8s-master中安装calico
kubectl apply -f https://docs.projectcalico.org/v3.20/manifests/calico.yaml
  • 确认一下calico是否安装成功
kubectl get pods --all-namespaces -o wide

添加和删除Pod

  • 定义pod.yml文件,比如pod_nginx_rs.yaml
cat > pod_nginx_rs.yaml <<EOF
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: nginx
  labels:
    tier: frontend
spec:
  replicas: 3
  selector:
    matchLabels:
      tier: frontend
  template:
    metadata:
      name: nginx
      labels:
        tier: frontend
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80
EOF
  • 根据pod_nginx_rs.yml文件创建pod
kubectl apply -f pod_nginx_rs.yaml
  • 查看所有pod的信息
kubectl get pods
  • 查看所有pod的详情信息
kubectl get pods -o wide
  • 查看指定pod的详情信息
kubectl describe pod nginx
  • 通过rs将pod扩容
kubectl scale rs nginx --replicas=5
  • 删除pod
kubectl delete -f pod_nginx_rs.yaml

重建集群

  • 在k8s-master节点上操作
kubeadm reset
rm -rf /etc/kubernetes
rm -rf $HOME/.kube
  • 在k8s-node1和k8s-node2节点上操作
rm -rf /etc/kubernetes
rm -rf /var/lib/kubelet/pki/kubelet-client*
systemctl stop kubelet
  • 使用上面的步骤重新初始化集群

常见问题

问题描述 原因 解决方案
dial tcp 127.0.0.1:10248: connect: connection refused docker和k8s没有设置同一个cgroup 将docker和k8s的cgroup都设置为systemd
Failed to list *v1.Pod: Unauthorized 没有权限 rm -rf /var/lib/kubelet/pki/kubelet-client*

kubeadm init流程

  1. 进行一系列检查,以确定这台机器可以部署kubernetes
  2. 生成kubernetes对外提供服务所需要的各种证书可对应目录/etc/kubernetes/pki/*
  3. 为其他组件生成访问kube-ApiServer所需的配置文件
ls /etc/kubernetes/

admin.conf  controller-manager.conf  kubelet.conf  scheduler.conf
  1. 为 Master组件生成Pod配置文件。
ls /etc/kubernetes/manifests/*.yaml

kube-apiserver.yaml 
kube-controller-manager.yaml
kube-scheduler.yaml
  1. 生成etcd的Pod YAML文件。
ls /etc/kubernetes/manifests/*.yaml

kube-apiserver.yaml 
kube-controller-manager.yaml
kube-scheduler.yaml
etcd.yaml
  1. 一旦这些 YAML 文件出现在被 kubelet 监视的/etc/kubernetes/manifests/目录下,kubelet就会自动创建这些yaml文件定义的pod,即master组件的容器。master容器启动后,kubeadm会通过检查localhost:6443/healthz这个master组件的健康状态检查URL,等待master组件完全运行起来
  2. 为集群生成一个bootstrap token
  3. 将ca.crt等 Master节点的重要信息,通过ConfigMap的方式保存在etcd中,供后续部署node节点使用
  4. 最后一步是安装默认插件,kubernetes默认kube-proxy和DNS两个插件是必须安装的
0

评论区