在日常工作中,公司内部的私有环境中免不了为每个团队,在不同的环境创建一个或多个 Kubernetes 集群,每次创建都需要从虚拟机的选型开始准备,然后到操作系统配置,软件安装,最后到集群初始化等等多个步骤。

而如果使用公有云服务,直接使用如像 EKS、ACK、AKS 和 GKE 时,集群可以直接初始化好一个高可用的控制层面,我们只需要添加一个或多个工作节点,用来处理我们业务需要即可。照着这个思路,我们找到了开源项目 Kamaji,一个可以实现 Controller AS Service 的工具。

预准备

本次实验需要用的两台服务器,规格如下:

hostnameoscpumemdisk
controller-managerCentos78C16G20G
workerCentos72C4G20G

我们将把 controller-mananger 服务器作为 Kubernetes 控制层面的管理集群,把 worker 节点后续将作为工作节点加入新的 Kubernets 集群中。

初始化控制层面的管理集群

我们将使用 controller-manager 初始化一个 Kubernets 集群,并在此集群中国安装以下工具:

  • OpenEBS
  • cert-manager
  • Kamaji

搭建及初始化 Kubernetes 集群

我们可以使用 Kubekey 工具搭建一个 Kubernetes 集群,详情可以参考此链接

在完成 Kubernetes 集群的搭建后,执行以下命令安装 OpenEBS、cert-manager 和 Kamaji 三个工具:

helm repo add openebs https://openebs.github.io/charts
helm repo update
helm upgrade --install openebs --namespace openebs openebs/openebs --create-namespace

helm repo add jetstack https://charts.jetstack.io
helm repo update
helm upgrade --install  cert-manager jetstack/cert-manager --namespace cert-manager --create-namespace --version v1.11.0 --set installCRDs=true

helm repo add clastix https://clastix.github.io/charts
helm repo update
helm upgrade --install kamaji clastix/kamaji -n kamaji-system --create-namespace

验证

执行 kubectl get pod -n kamaji-system,显示以下内容证明安装成功:

NAME                     READY   STATUS    RESTARTS      AGE
etcd-0                   1/1     Running   3 (57s ago)   22h
etcd-1                   1/1     Running   3 (57s ago)   22h
etcd-2                   1/1     Running   3 (57s ago)   22h
kamaji-5fb885b59-jkgcf   1/1     Running   4 (57s ago)   22h

创建 Kubernetes 的控制层面

登录到 controller-manager 将下面的 tenant-00.yaml 文件保存在 /root 目录下面,并执行 kubectl apply -f tenant-00.yaml 命令,创建一个新的 Kubernets 的控制层面。

apiVersion: kamaji.clastix.io/v1alpha1
kind: TenantControlPlane
metadata:
name: tenant-00
namespace: default
labels:
    tenant.clastix.io: tenant-00
spec:
    dataStore: default
    controlPlane:
        deployment:
        replicas: 3
        additionalMetadata:
            labels:
            tenant.clastix.io: tenant-00
        extraArgs:
            apiServer: []
            controllerManager: []
            scheduler: []
        registrySettings:
            apiServerImage: kube-apiserver
            controllerManagerImage: kube-controller-manager
            registry: registry.cn-hangzhou.aliyuncs.com/google_containers
            schedulerImage: kube-scheduler
        resources:
            apiServer:
            requests:
                cpu: 250m
                memory: 512Mi
            limits: {}
            controllerManager:
            requests:
                cpu: 125m
                memory: 256Mi
            limits: {}
            scheduler:
            requests:
                cpu: 125m
                memory: 256Mi
            limits: {}
        service:
        additionalMetadata:
            labels:
            tenant.clastix.io: tenant-00
        serviceType: NodePort
    kubernetes:
        version: v1.26.0
        kubelet:
        cgroupfs: systemd
        admissionControllers:
        - ResourceQuota
        - LimitRanger
    networkProfile:
        port: 32100
        certSANs:
        - tenant-00.clastix.labs
        serviceCidr: 10.96.0.0/12
        podCidr: 10.244.0.0/16
        allowAddressAsExternalIP: true
        address: '192.168.8.109' ##修改为 controller-manager 服务的 IP 地址
        dnsServiceIPs:
        - 10.96.0.10 
    addons:
        coreDNS: 
        imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers
        kubeProxy: 
        imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers
        konnectivity:
        agent:
            image: registry.cn-hangzhou.aliyuncs.com/k8sss212/proxy-agent
            version: v0.0.32
        server:
            image: registry.cn-hangzhou.aliyuncs.com/k8sss212/proxy-server
            port: 32101
            resources:
            requests:
                cpu: 100m
                memory: 128Mi
            limits: {}
---
apiVersion: v1
kind: Service
metadata:
name: tenant-00-public
namespace: default
spec:
ports:
- port: 443
    protocol: TCP
    targetPort: 6443
selector:
    kamaji.clastix.io/name: tenant-00
type: NodePort

在创建完成之后,执行 kubectl get TenantControlPlane,显示如下即代表新的 Kubernetes 的控制节点初始化成功。

NAME        VERSION   STATUS   CONTROL-PLANE ENDPOINT   KUBECONFIG                   DATASTORE   AGE
tenant-00   v1.26.0   Ready    192.168.8.109:32100      tenant-00-admin-kubeconfig   default     24h

同时还可以执行 curl -k https://192.168.8.109:32100/healthzcurl -k https://192.168.8.109:32100/version 获取新的 Kubernets 集群的健康状态和版本情况。

添加工作节点

登录到 worker 服务器,我们将把 worker 服务器加入到新的 Kubernetes 集群中。

初始化服务器

初始化操作系统

Kubernets 的每个节点都需在操作系统层面优化内核参数和一些简单的配置,执行以下命令进行操作:

swapoff -a
modprobe  br_netfilter
echo "worker" > /etc/hostname
cat > /etc/hosts <<EOF
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
worker 192.168.8.110
EOF
systemctl stop firewalld
systemctl disable firewalld

接着我们需要优化内核参数,将下面内容添加到 /etc/sysctl.conf 中,然后执行命令 sysctl -p

net.ipv4.ip_forward = 1
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 0
net.ipv4.tcp_fin_timeout = 300
net.bridge.bridge-nf-call-arptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_local_reserved_ports = 30000-32767
net.core.somaxconn = 65535
net.core.netdev_max_backlog = 65535
net.netfilter.nf_conntrack_tcp_be_liberal=1
net.netfilter.nf_conntrack_tcp_loose=1
net.netfilter.nf_conntrack_max=3200000
net.netfilter.nf_conntrack_tcp_timeout_time_wait=30
net.ipv4.tcp_timestamps=1
net.ipv4.ip_local_port_range=5120 65000
net.ipv4.tcp_fin_timeout=30
net.ipv4.tcp_max_syn_backlog=10240
net.core.somaxconn=10240
net.ipv4.tcp_syncookies=1
安装软件并配置

我们需要在 worker 服务器上面添加以下软件:

  • containerd
  • kubeadm-1.26.0
  • kubelet-1.26.0
  • kubectl-1.26.0

在安装之前,我们需要配置 docker-ce 和 k8s 相关的两个 yum 仓库,具体操作可以参考这两个文档:

在配置完成之后执行以下命令安装以上软件:

yum install containerd kubelet-1.26.0 kubeadm-1.26.0 kubelet-1.26.0 -y

在安装好之后,我们需要配置 containerd 和 kubelet 的一些参数,先执行 containerd config default > /etc/containerd/config.toml,然后修改 config.toml 中的以下字段:

[grpc]
  address = "/var/run/containerd/containerd.sock"

[plugins]
  
  [plugins."io.containerd.grpc.v1.cri"]
     ....
     sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.9"
     ....

然后我们需要修改 kubelet 的一些配置参数,将 /var/lib/kubelet/kubeadm-flags.env 修改为以下内容:

KUBELET_KUBEADM_ARGS="--container-runtime-endpoint=unix:///var/run/containerd/containerd.sock   --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.9"

在修改完成之后执行,以下命令启动 containerd 和 kubelet:

systemctl start containerd
systemctl enable containerd
systemctl start kubelet
systemctl enable kubelet

集群添加新节点

在 controller-manager 服务器上执行,以下命令获得 kubeconfig 文件:

kubectl get secrets  tenant-00-admin-kubeconfig -o json \
  | jq -r '.data["admin.conf"]' \
  | base64 --decode \
  > tenant-00-config

!!! note
如果没有 jq 命令,可以执行命令 yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm -y && yum install jq -y 进行安装。

拿到 kubeconfig 文件之后,执行 kubeadm --kubeconfig=tenant-00-config token create --print-join-command 获得加入 kubernetes 集群的命令,显示输出如下:

kubeadm join 192.168.8.109:32100 --token 8yoojw.yhu45tqh00tw3ype --discovery-token-ca-cert-hash sha256:1f4fc8b9c358b7d046d9a1faed1e70640290af1bef2eaaea4bc4611773cd6573

在 worker 节点上执行以下命令,即可加入新的 Kubernets 集群:

kubeadm join 192.168.8.109:32100 --token 8yoojw.yhu45tqh00tw3ype --discovery-token-ca-cert-hash sha256:1f4fc8b9c358b7d046d9a1faed1e70640290af1bef2eaaea4bc4611773cd6573 

在 controller-manager 服务器上执行命令 kubectl --kubeconfig=tenant-00-config get node 显示如下:

NAME     STATUS     ROLES    AGE    VERSION
worker   NotReady   <none>   112s   v1.26.0

在新的 k8s 节点上安装 calico 网络插件,在 controller-manager 服务器上执行以下命令:

kubectl  --kubeconfig=tenant-00-config apply  -f  https://raw.githubusercontent.com/projectcalico/calico/v3.24.1/manifests/calico.yaml 

安装完成执行之后,执行 kubectl --kubeconfig=tenant-00-config get pod -A 进行验证,输出如下则代表当前 Kubernetes 集群已经正常:

NAMESPACE     NAME                                       READY   STATUS    RESTARTS      AGE
kube-system   calico-kube-controllers-5f94594857-jpcl9   1/1     Running   1 (71m ago)   19h
kube-system   calico-node-j7wcl                          1/1     Running   1 (71m ago)   19h
kube-system   coredns-6f44f86fd8-jzlwp                   1/1     Running   0             32m
kube-system   konnectivity-agent-nlhr6                   1/1     Running   1 (71m ago)   19h
kube-system   kube-proxy-99vrf                           1/1     Running   1 (71m ago)   19h
Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐