什么是kubeadm

kubeadm是一种命令行工具,主要用于Kubernetes集群的创建和管理。它可以自动配置和初始化一个Kubernetes master节点,也可以给工作节点拉取必要的Kubernetes组件。

kubeadm主要特性包括:

  1. Bootstrap:kubeadm可以初始化一个Kubernetes master或将一个Kubernetes工作节点添加到集群。
  2. 安全设置:kubeadm自动生成了所有需要的证书,并设置好了kubeconfig和授权模式。
  3. 控制平面的高可用性:kubeadm可以创建出高可用(HA)的Kubernetes集群控制平面。
  4. 插件的管理:kubeadm可以管理Kubernetes的各种插件,比如网络插件和节点引导插件。

简单来说,如果你想快速方便地部署Kubernetes集群,kubeadm是一个很好的工具。

---- by gpt-4

实践服务器

  • 服务器1(计划用于Master节点)

提供商:DigitalOcean

配置:2C/4G/80GB Disk

系统:Debian 12

位置:美国旧金山(SFO3)

  • 服务器2(计划用于Worker节点)

提供商:DigitalOcean

配置:1C/2G/50GB Disk

系统:Debian 12

位置:美国旧金山(SFO3)

安装步骤

本文以root用户操作,如果你不使用root用户,命令前可能需要加 sudo

在服务器1中的操作

安装docker:curl https://get.docker.com | sh

**安装kubeadm:**见官方文档,命令总结如下。

apt-get update
apt-get install -y apt-transport-https ca-certificates curl
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.28/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.28/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list
apt-get update
apt-get install -y kubelet kubeadm kubectl
apt-mark hold kubelet kubeadm kubectl

接下来应该执行 kubeadm init,但是kubeadm无法正确的找到docker,错误如下所示:

root@k8sadm:~# kubeadm init
[init] Using Kubernetes version: v1.28.2
[preflight] Running pre-flight checks
error execution phase preflight: [preflight] Some fatal errors occurred:
        [ERROR CRI]: container runtime is not running: output: time="2023-09-25T02:18:38Z" level=fatal msg="validate service connection: validate CRI v1 runtime API for endpoint \"unix:///var/run/containerd/containerd.sock\": rpc error: code = Unimplemented desc = unknown service runtime.v1.RuntimeService"
, error: exit status 1
[preflight] If you know what you are doing, you can make a check non-fatal with `--ignore-preflight-errors=...`
To see the stack trace of this error execute with --v=5 or higher

因此还需要安装cri-dockerd:

从官方releases下载合适的包:https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.4/cri-dockerd_0.3.4.3-0.debian-bullseye_amd64.deb

安装它:dpkg -i cri-dockerd_0.3.4.3-0.debian-bullseye_amd64.deb

配置systemd守护进程:vi /etc/systemd/system/cri-dockerd.service

写入以下内容:

[Unit]
Description=cri-dockerd
After=network.target

[Service]
ExecStart=/usr/bin/cri-dockerd
Restart=on-failure

[Install]
WantedBy=multi-user.target

然后 systemctl daemon-reload systemctl start cri-dockerd systemctl enable cri-dockerd

初始化集群:kubeadm init --cri-socket=unix:///var/run/cri-dockerd.sock --pod-network-cidr=10.244.0.0/16

这条命令中的 --pod-network-cidr参数是为后续安装Flannel网络插件做准备,如果你不使用Flannel,可无需指定。

命令执行完成后会看到类似输出:

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 143.198.*.*:6443 --token p72hkf.xn4xkr2vtso8eho4 \
        --discovery-token-ca-cert-hash sha256:872e5c65d777b968b11f9061db83179dcedbb75a82b161dc8d27569ec3d6dd73

安装Flannel网络插件:kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

应该会看到Flannel网络已经在你的集群中正确运行了。

你可以使用以下命令查看Pod的网络:

kubectl get pods --all-namespaces -o jsonpath='{range .items[*]}{"\n"}{.metadata.name}{":\t"}{range .status.containerStatuses[*]}{.ready}{", "}{end}{end}'

输出:

kube-flannel-ds-xd6sl:  true, 
kube-flannel-ds-z27lx:  true, 
coredns-5dd5756b68-9pngq:       true, 
coredns-5dd5756b68-px726:       true, 
etcd-k8sadm:    true, 
kube-apiserver-k8sadm:  true, 
kube-controller-manager-k8sadm: true, 
kube-proxy-bkqrv:       true, 
kube-proxy-c75sx:       true, 
kube-scheduler-k8sadm:  true,

在服务器2中的操作

在服务器1对集群初始化时,输出了集群的对接命令。

在服务器2中安装docker、cri-dockerd、kubelet、kubeadm、kubectl后,执行对接命令。

在服务器1中的操作

验证你的安装:kubectl get nodes

root@k8sadm:~# kubectl get nodes
NAME      STATUS   ROLES           AGE   VERSION
k8sadm    Ready    control-plane   86m   v1.28.2
worker3   Ready    <none>          83m   v1.28.2

status栏显示 Ready就可以了。

应用部署步骤

nginx被称作k8s世界的hello world,所以我们部署一个nginx的deployment。

部署操作均在服务器1(Master节点)执行。

下面开始~

为了导入配置,首先需要配置Config Map

新建你的nginx配置文件:vi default.conf

输入内容(示例):

server {
    listen       80;
    location / {
        proxy_pass  http://154.16.248.181:8081;
    }
}

创建一个名字为"nginx-conf"的Config Map:kubectl create configmap nginx-conf --from-file ~/default.conf

后续如要修改配置,可以使用:kubectl edit cm nginx-conf

"cm"是"configmap"的简写。

配置Nginx Deployment

新建你的deployment配置文件:vi nginx.yaml

写入以下内容:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-nginx
spec:
  selector:
    matchLabels:
      run: my-nginx
  replicas: 1
  template:
    metadata:
      labels:
        run: my-nginx
    spec:
      containers:
      - name: my-nginx
        image: nginx
        ports:
        - containerPort: 80
        volumeMounts:
        - name: nginx-conf-volume
          mountPath: /etc/nginx/conf.d/default.conf
          subPath: default.conf
        - name: nginx-log
          mountPath: /var/log/nginx
      volumes:
      - name: nginx-conf-volume
        configMap:
          name: nginx-conf
      - name: nginx-log
        hostPath:
          path: /var/log/nginx

这个k8s配置文件中关于存储的配置如下:

  1. 创建了两个卷:
  • 名称为nginx-conf-volume的配置映射卷,使用的配置映射资源为nginx-conf。
  • 名称为nginx-log的主机路径卷,使用的主机目录为/var/log/nginx。
  1. 在容器中使用了volumeMounts字段来挂载这两个卷:
  • 对于nginx-conf-volume卷,将其挂载到容器的/etc/nginx/conf.d/default.conf路径,并将其中的default.conf文件作为子路径挂载。
  • 对于nginx-log卷,将其挂载到容器的/var/log/nginx路径。

这样配置后,容器中的nginx进程可以读取配置文件/etc/nginx/conf.d/default.conf,并将日志写入/var/log/nginx目录中。

----by gpt-3

启动这个nginx deployment:kubectl apply -f ~/nginx.yaml

观察运行状态:

root@k8sadm:~# kubectl apply -f ~/k8s-yaml/nginx.yaml
deployment.apps/my-nginx created
root@k8sadm:~# kubectl get pods -o wide
NAME                        READY   STATUS    RESTARTS   AGE   IP           NODE      NOMINATED NODE   READINESS GATES
my-nginx-69775c989f-xgrdw   1/1     Running   0          16s   10.244.1.5   worker3   <none>           <none>
root@k8sadm:~# kubectl get deployments
NAME       READY   UP-TO-DATE   AVAILABLE   AGE
my-nginx   1/1     1            1           21s

最后,需要配置相关的端口映射服务,使应用能被外部访问。

配置NodePort Service

新建你的service配置文件:vi node-port-service.yaml

写入以下内容:

kind: Service
apiVersion: v1
metadata:
  name: nginx-service
spec:
  selector:
    run: my-nginx
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
  type: NodePort

注意spec-selector中的配置,确保该服务service绑定pod。

启动服务:kubectl create -f ./node-port-service.yaml

观察运行状态:

root@k8sadm:~# kubectl get service
NAME            TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
kubernetes      ClusterIP   10.96.0.1       <none>        443/TCP        4h43m
nginx-service   NodePort    10.107.115.33   <none>        80:30393/TCP   4m15s

访问相关worker的IP:Port,应该可以正常访问。

image.png

huaji

大功告成!


标题:记录第一次使用kubeadm
作者:xiaojie
地址:https://www.xiaojie.dev/articles/2023/09/25/1695617929575.html