系列文章

  1. K8S集群高可用部署
  2. kubeadm部署k8s集群

机器列表

IP地址主机名角色
10.211.55.200ubuntu2204-adm-masterMaster
10.211.55.201ubuntu2204-adm-node1Node1
10.211.55.202ubuntu2204-adm-node2Node2

Parallels desktop虚机处理

PD处理虚机克隆后product_uuid相同的方法:

  1. 先解除绑定,可以使用删除并保留文件的方式,也可以使用命令行

    1
    2
    3
    4
    5
    6
    7
    8
    $ prlctl unregister ID|name

    ID/name: 为虚拟机名字

    比如我就是使用命令:

    $ prlctl unregister "kubernetes01 node1"

  2. 重新注册,注册的时候加上重新生成 UUID 的参数

    1
    2
    3
    4
    5
    6
    $ prlctl register path --regenerate-src-uuid

    path: 虚拟机的 pvm 文件路径。

    执行后重启 product_uuid 即更改。

Ubuntu22.04 虚机配置

每台机器的/etc/hosts配置:

1
2
3
4
10.211.55.200 ubuntu2204-adm-master
10.211.55.201 ubuntu2204-adm-node1
10.211.55.202 ubuntu2204-adm-node2

K8S集群安装

官方文档:https://kubernetes.io/zh-cn/docs/setup/production-environment/tools/kubeadm/install-kubeadm/

以下操作都需要在3台机器中完成配置!

环境基础配置

  • 关闭swap:

    1
    2
    3
    swapoff -a
    sed -i '/\/swap.img/ s/^\(.*\)$/#\1/g' /etc/fstab

  • 允许iptables检查桥接流量:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    modprobe br_netfilter

    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

安装容器运行时(docker)

  • 安装docker:

    1
    2
    3
    4
    apt update
    apt install docker.io
    docker version

  • 配置docker:

    1
    2
    3
    4
    5
    6
    7
    8
    # 换成阿里Docker仓库
    cat > /etc/docker/daemon.json << EOF
    {
    "exec-opts": ["native.cgroupdriver=systemd"],
    "registry-mirrors": ["https://tk6cqevn.mirror.aliyuncs.com"]
    }
    EOF

  • 启动docker:

    1
    2
    3
    4
    systemctl restart docker
    systemctl enable docker
    docker info

安装 kubeadm、kubelet 和 kubectl

  • 安装基础工具:

    1
    2
    apt-get install -y apt-transport-https ca-certificates curl

  • 使用阿里云安装K8S工具:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    # 下载apt-key
    curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg

    # 添加阿里云K8S源
    echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list

    # 更新源
    apt-get update

    # 查看可以安装的k8s版本
    apt-cache madison kubeadm

    # 使用指定版本安装k8s
    apt-get install -y kubelet=1.23.8-00 kubeadm=1.23.8-00 kubectl=1.23.8-00

    # 安装最新版本
    apt-get install -y kubelet kubeadm kubectl

    systemctl enable kubelet

使用 kubeadm 创建集群

Master节点初始化

以下操作在Master节点中进行!

  • 因网络较慢,所以先使用kubeadm config下载K8S组件镜像:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    # 查看当前会使用的k8s镜像版本
    kubeadm config images list

    # 使用阿里云的镜像仓库,拉取镜像到本地
    kubeadm config images pull --image-repository registry.cn-hangzhou.aliyuncs.com/google_containers --kubernetes-version 1.23.8

    # 镜像在一台主机上下载完成后,使用docker命令导出所有K8S相关的镜像
    docker save -o k8s_1.23.8_all_images.tar `docker images | grep 'registry.cn-hangzhou.aliyuncs.com/google_containers' | awk '{print $1 ":" $2}' | xargs`

    # 使用scp复制镜像压缩文件到其余2台机器,并导入镜像
    docker load -i k8s_1.23.8_all_images.tar
    docker images

  • 使用命令行方式初始化Master节点(二选一):

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    kubeadm init \
    --apiserver-advertise-address=10.211.55.200 \
    --image-repository registry.cn-hangzhou.aliyuncs.com/google_containers \
    --kubernetes-version v1.23.8 \
    --service-cidr=10.96.0.0/12 \
    --pod-network-cidr=10.244.0.0/16

    # 参数解析
    --apiserver-advertise-address # api-server的广播地址,一般跟 Master ip 地址相同
    --image-repository # K8S组件镜像仓库地址,默认为k8s.gcr.io,由于国内无法访问,所以需要更改为阿里云的
    --kubernetes-version # k8s版本
    --service-cidr # service的网络地址范围
    --pod-network-cidr # pod的网络地址范围

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

    # 将输出中的join信息保存下来,接下来的Node节点初始化需要用到
    kubeadm join 10.211.55.200:6443 --token 2oa********z9u \
    --discovery-token-ca-cert-hash sha256:ea7874e7f3f9e651********847791

    # 如果只想安装单机的K8S,可将Master节点的污点属性清除,让pod能调度到该节点上
    kubectl describe node ubuntu2204-adm-master | grep Taints
    kubectl taint nodes ubuntu2204-adm-master node-role.kubernetes.io/control-plane- node-role.kubernetes.io/master-

  • 使用配置文件方式初始化Master节点(二选一):

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    # 生成初始化yml配置文件
    kubeadm config print init-defaults > kubeadm.yaml

    # 编辑配置文件
    # kubeadm-config配置字段详解:https://kubernetes.io/zh-cn/docs/reference/config-api/kubeadm-config.v1beta3/
    vim kubeadm.yaml
    # 修改api-server的广播地址
    localAPIEndpoint.advertiseAddress: 10.211.55.200
    # 修改Master节点名
    nodeRegistration.name: ubuntu2204-adm-master
    # 修改K8S组件镜像仓库地址
    imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers
    #修改K8S版本
    kubernetesVersion: 1.23.8
    # 新增pod网络范围
    podSubnet: 10.244.0.0/16

    #其余配置,请根据自身需求,查询官方手册自行添加!
    # kubeadm.yml文件样例:
    apiVersion: kubeadm.k8s.io/v1beta3
    bootstrapTokens:
    - groups:
    - system:bootstrappers:kubeadm:default-node-token
    token: abcdef.0123456789abcdef
    ttl: 24h0m0s
    usages:
    - signing
    - authentication
    kind: InitConfiguration
    localAPIEndpoint:
    advertiseAddress: 10.211.55.200
    bindPort: 6443
    nodeRegistration:
    criSocket: /var/run/dockershim.sock
    imagePullPolicy: IfNotPresent
    name: ubuntu2204-adm-master
    taints: null
    ---
    apiServer:
    timeoutForControlPlane: 4m0s
    apiVersion: kubeadm.k8s.io/v1beta3
    certificatesDir: /etc/kubernetes/pki
    clusterName: kubernetes
    controllerManager: {}
    dns: {}
    etcd:
    local:
    dataDir: /var/lib/etcd
    imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers
    kind: ClusterConfiguration
    kubernetesVersion: 1.23.8
    networking:
    dnsDomain: cluster.local
    serviceSubnet: 10.96.0.0/12
    podSubnet: 10.244.0.0/16
    scheduler: {}

    如果需要配置kube-proxy的工作模式为ipvs,可在kubeadm.yaml文件中加入以下配置:

    1
    2
    3
    4
    5
    6
    # kube-proxy配置字段详解:https://kubernetes.io/zh-cn/docs/reference/config-api/kube-proxy-config.v1alpha1/
    ---
    apiVersion: kubeproxy.config.k8s.io/v1alpha1
    kind: KubeProxyConfiguration
    mode: ipvs

    初始化master:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    # 查询初始化会使用的镜像列表
    kubeadm config images list --config=kubeadm.yaml

    # 初始化
    kubeadm init --config kubeadm.yaml

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

    # 将输出中的join信息保存下来,接下来的Node节点初始化需要用到
    kubeadm join 10.211.55.200:6443 --token 2oa********z9u \
    --discovery-token-ca-cert-hash sha256:ea7874e7f3f9e651********847791

    # 如果只想安装单机的K8S,可将Master节点的污点属性清除,让pod能调度到该节点上
    kubectl describe node ubuntu2204-adm-master | grep Taints
    kubectl taint nodes ubuntu2204-adm-master node-role.kubernetes.io/control-plane- node-role.kubernetes.io/master-


    若安装过程出错,可卸载干净K8S,再重试:

    1
    2
    3
    4
    5
    6
    7
    # 卸载k8s master
    kubeadm reset -f
    rm -rf /etc/cni/net.d
    rm -rf $HOME/.kube/
    iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X
    ipvsadm -C

Node节点初始化

以下操作在2台Nde节点机器中进行!

1
2
3
4
5
6
7
8
9
10
# 检查master节点操作时,K8S组件镜像有无导入成功
docker images

# 使用master节点初始化时的命令,kubeadm join进行Node节点初始化
kubeadm join 10.211.55.200:6443 --token 2oa********z9u \
--discovery-token-ca-cert-hash sha256:ea7874e7f3f9e651********847791

# 若忘记join的token,可使用以下命令重新生成
kubeadm token create --print-join-command --ttl="24h0m0s"

部署 CNI 网络插件

这里选择flannel作为CNI插件。

部署flannel插件,容器镜像下载较慢,建议自备梯子下载,或找国内别人搭建的镜像仓库下载。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# flannel部署文件:https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
# 编辑部署文件
vim kube-flannel.yml
# 修改名称为kube-flannel-cfg的ConfigMap,将net-conf.json中的Network改成和pod-network-cidr一致
net-conf.json: |
{
"Network": "10.244.0.0/16",
"Backend": {
"Type": "vxlan"
}
}

# 名称为kube-flannel-ds的DaemonSet,其中的image镜像,最好先提前导入镜像到所有节点,在所有节点执行
docker load -i flannel-v0.18.1.tar

# 部署插件,在Master节点上执行
kubectl apply -f kube-flannel.yml

检查集群状态

1
2
3
4
5
kubectl get nodes
NAME STATUS ROLES AGE VERSION
ubuntu2204-adm-master Ready control-plane,master 45m v1.23.8
ubuntu2204-adm-node1 Ready <none> 29m v1.23.8
ubuntu2204-adm-node2 Ready <none> 29m v1.23.8