陈佳浩
陈佳浩
发布于 2024-06-26 / 23 阅读
0
0

Kubernetes使用

  • Kubernetes使用
  • Kubernetes
    • 部署
      • kubeadm部署
        • 预准备环境
        • 安装容器运行时(两种二选其一)
          • docke-ce和cri-dockerd
          • Containerd
        • 安装kubelet、kubeadm和kubectl
        • 整合kubelet和cri-dockerd(仅cri-dockerd需要)
          • 配置cri-dockerd
          • 配置kubelet
        • 初始化第一个主节点
          • 初始化master节点(在master01上完成如下操作)
          • 集群初始化
            • 命令行初始化
            • yaml配置文件初始化
          • 初始化完成后的操作步骤
          • 设定kubectl
          • 部署网络插件
          • 验证master节点已经就绪
          • 添加节点到集群中
          • 验证节点添加结果
    • API资源规范
      • 常见的API资源
        • 五个一级字段
        • API资源组
        • 查看资源组内包含的资源类型
        • 查看资源类型有多少个一级字段二级字段
    • kubectl的三种对象管理机制
      • 指令式命令
      • 指令式对象配置
      • 常用的指令式命令
      • 声明式对象配置

Kubernetes

部署

kubeadm部署

预准备环境

  • 进行时间同步,确定主机时间一致

    #安装
    yum -y install chrony
    #启动
    systemctl enable --now chrony
    配置
    vim /etc/chrony/chrony.conf
    server CHRONY-SERVER-NAME-OR-IP iburst
    
  • 使用DNS完成各节点名称解析

  • 禁用swap设备

    #临时禁用
    swapoff -a
    #取消挂载swap设备
    vim /etc/fstab
    注释掉用于挂载swap设备的行
    
  • 关闭防火墙

    systemctl disable --now firewalld
    

安装容器运行时(两种二选其一)

docke-ce和cri-dockerd
  • 安装docker-ce

    • kubelet需要让docker容器引擎使用systemd作为CGroup的驱动,其默认值为cgroupfs,因而,我们还需要编辑docker的配置文件/etc/docker/daemon.json,添加如下内容:

      #编辑配置文件
      vim /etc/docker/daemon.json
      {
      "registry-mirrors": [
        "https://registry.docker-cn.com"
      ],
      "exec-opts": ["native.cgroupdriver=systemd"],
      "log-driver": "json-file",
      "log-opts": {
        "max-size": "200m"
      },
      "storage-driver": "overlay2"  
      }
      #重载服务
      systemctl daemon-reload
      systemctl restart docker
      systemctl enable docker
      
    • 配置Docker的代理服务(不是镜像代理,可选)

      #编辑service文件
      vim /lib/systemd/system/docker,service
      Environment="HTTP_PROXY=http://$PROXY_SERVER_IP:$PROXY_PORT"
      Environment="HTTPS_PROXY=https://$PROXY_SERVER_IP:$PROXY_PORT"
      Environment="NO_PROXY=127.0.0.0/8,172.17.0.0/16,172.29.0.0/16,10.244.0.0/16,192.168.0.0/16,home.com,cluster.local"
      #重载docker服务
      systemctl daemon-reload
      systemctl restart docker
      
  • 安装cri-dockerd

    • cri-dockerd项目地址

      https://github.com/Mirantis/cri-dockerd
      
    • 安装

      #下载软件包
      curl -LO https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.9/cri-dockerd-0.3.9-3.el7.x86_64.rpm
      yum -y install ./cri-dockerd-0.3.9-3.el7.x86_64.rpm
      #启动
      systemctl enable --now cri-docker.service
      
Containerd

containerd有官方程序包和Docker社区提供的containerd.io,这里使用后者。

......暂时先不记了......

安装kubelet、kubeadm和kubectl

需要先配置yum源然后直接yum安装

#安装
yum -y install kubelet kubeadm kubectl
#设置启动
systemctl enable --now kubelet

安装完成后,要确保kubeadm等程序文件的版本,这将也是后面初始化Kubernetes集群时需要明确指定的版本号。

整合kubelet和cri-dockerd(仅cri-dockerd需要)

配置cri-dockerd

编辑/lib/systemd/system/cri-docker.service文件,确保其能够正确加载到CNI插件。

#编辑配置文件
ExecStart=/usr/bin/cri-dockerd --container-runtime-endpoint fd:// --network-plugin=cni --cni-bin-dir=/opt/cni/bin --cni-cache-dir=/var/lib/cni/cache --cni-conf-dir=/etc/cni/net.d

需要添加的各配置参数(各参数的值要与系统部署的CNI插件的实际路径相对应):

  • --network-plugin:指定网络插件规范的类型,这里要使用CNI;
  • --cni-bin-dir:指定CNI插件二进制程序文件的搜索目录;
  • --cni-cache-dir:CNI插件使用的缓存目录;
  • --cni-conf-dir:CNI插件加载配置文件的目录;

配置完成后,重载并重启cri-docker.service服务。

systemctl daemon-reload && systemctl restart cri-docker.service
配置kubelet

配置kubelet,为其指定cri-dockerd在本地打开的Unix Sock文件的路径,该路径一般默认为“/run/cri-dockerd.sock“。编辑文件/etc/sysconfig/kubelet,为其添加 如下指定参数。

#编辑配置文件
KUBELET_KUBEADM_ARGS="--container-runtime=remote --container-runtime-endpoint=/run/cri-dockerd.sock"

需要说明的是,该配置也可不进行,而是直接在后面的各kubeadm命令上使用“--cri-socket unix:///run/cri-dockerd.sock”选项

初始化第一个主节点

需要说明的是,这里初始化节点拉取镜像时,需要用到科学上网,当然也可以使用国内的镜像服务器上的服务,例如registry.aliyuncs.com/google_containers等。如果需要从国内的Mirror站点下载Image,还需要在命令上使用“--image-repository”选项来指定Mirror站点的相关URL。

初始化master节点(在master01上完成如下操作)

在运行初始化命令之前先运行如下命令单独获取相关的镜像文件,而后再运行后面的kubeadm init命令,以便于观察到镜像文件的下载过程。

#使用官方镜像
kubeadm config images list
#使用阿里云代理
kubeadm config images list --image-repository=registry.aliyuncs.com/google_containers

上面的命令会列出类似如下的Image信息。

registry.k8s.io/kube-apiserver:v1.28.2
registry.k8s.io/kube-controller-manager:v1.28.2
registry.k8s.io/kube-scheduler:v1.28.2
registry.k8s.io/kube-proxy:v1.28.2
registry.k8s.io/pause:3.9
registry.k8s.io/etcd:3.5.7-0
registry.k8s.io/coredns/coredns:v1.10.1

拉取镜像

#拉取官方镜像
kubeadm config images pull --cri-socket unix:///run/cri-dockerd.sock
#使用阿里云的镜像仓库
kubeadm config images pull --image-repository=registry.aliyuncs.com/google_containers

拉取完成

[config/images] Pulled registry.k8s.io/kube-apiserver:v1.28.2
[config/images] Pulled registry.k8s.io/kube-controller-manager:v1.28.2
[config/images] Pulled registry.k8s.io/kube-scheduler:v1.28.2
[config/images] Pulled registry.k8s.io/kube-proxy:v1.28.2
[config/images] Pulled registry.k8s.io/pause:3.9
[config/images] Pulled registry.k8s.io/etcd:3.5.6-0
[config/images] Pulled registry.k8s.io/coredns/coredns:v1.9.3
集群初始化

集群初始化有两种方式,一种使用命令行进行初始化,另一种使用yaml格式的配置文件初始化。

命令行支持传递关键的部署设定,配置文件允许用户自定义各个部署参数,在配置上更为灵活

命令行初始化

运行如下命令完成节点1的初始化

kubeadm init \      
      --control-plane-endpoint="kubeapi.home.com" \
      --kubernetes-version=v1.28.2 \
      --pod-network-cidr=10.244.0.0/16 \
      --service-cidr=10.96.0.0/12 \
      --token-ttl=0 \
      --cri-socket unix:///run/cri-dockerd.sock \
      --upload-certs

提示:无法访问registry.k8s.io时,同样可以在上面的命令中使用“--image-repository=registry.aliyuncs.com/google_containers”选项,以便从国内的镜像服务中获取各Image;

命令中的各选项简单说明如下:

  • --image-repository:指定要使用的镜像仓库,默认为registry.k8s.io;
  • --kubernetes-version:kubernetes程序组件的版本号,它必须要与安装的kubelet程序包的版本号相同;
  • --control-plane-endpoint:控制平面的固定访问端点,可以是IP地址或DNS名称,会被用于集群管理员及集群组件的kubeconfig配置文件的API Server的访问地址;单控制平面部署时可以不使用该选项;
  • --pod-network-cidr:Pod网络的地址范围,其值为CIDR格式的网络地址,通常,Flannel网络插件的默认为10.244.0.0/16,Project Calico插件的默认值为192.168.0.0/16;
  • --service-cidr:Service的网络地址范围,其值为CIDR格式的网络地址,默认为10.96.0.0/12;通常,仅Flannel一类的网络插件需要手动指定该地址;
  • --apiserver-advertise-address:apiserver通告给其他组件的IP地址,一般应该为Master节点的用于集群内部通信的IP地址,0.0.0.0表示节点上所有可用地址;
  • --token-ttl:共享令牌(token)的过期时长,默认为24小时,0表示永不过期;为防止不安全存储等原因导致的令牌泄露危及集群安全,建议为其设定过期时长。未设定该选项时,在token过期后,若期望再向集群中加入其它节点,可以使用如下命令重新创建token,并生成节点加入命令。
kubeadm token create --print-join-command
yaml配置文件初始化

kubeadm也可通过配置文件加载配置,以定制更丰富的部署选项。获取内置的初始配置文件的命令。

kubeadm config print init-defaults

面的配置示例,是以上面命令的输出结果为框架进行修改的,它明确定义了kubeProxy的模式为ipvs,并支持通过修改imageRepository的值修改获取系统镜像时使用的镜像仓库。

apiVersion: kubeadm.k8s.io/v1beta3
bootstrapTokens:
kind: InitConfiguration
localAPIEndpoint:
# 这里的地址即为初始化的控制平面第一个节点的IP地址;
advertiseAddress: 172.29.1.1
bindPort: 6443
nodeRegistration:
# 注意按需调整这里使用的cri socket文件的路径;
criSocket: unix:///run/cri-dockerd.sock
imagePullPolicy: IfNotPresent
# 第一个控制平面节点的主机名称;
name: k8s-master01.home.com
taints:
- effect: NoSchedule
  key: node-role.kubernetes.io/master
- effect: NoSchedule
  key: node-role.kubernetes.io/control-plane
---
apiServer:
timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta3
# 控制平面的接入端点,我们这里选择适配到kubeapi.home.com这一域名上;
controlPlaneEndpoint: "kubeapi.home.com:6443"
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns: {}
etcd:
local:
  dataDir: /var/lib/etcd
imageRepository: registry.aliyuncs.com/google_containers
kind: ClusterConfiguration
kubernetesVersion: v1.28.2
networking:
dnsDomain: cluster.local
serviceSubnet: 10.96.0.0/12
podSubnet: 10.244.0.0/16
scheduler: {}
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
# 用于配置kube-proxy上为Service指定的代理模式,默认为iptables;
mode: "ipvs"

将上面的内容保存于配置文件中,例如kubeadm-config.yaml,而后执行如下命令即能实现类似前一种初始化方式中的集群初始配置,但这里将Service的代理模式设定为了ipvs。

kubeadm init --config kubeadm-config.yaml --upload-certs
初始化完成后的操作步骤

无论哪种初始化方式,命令运行结束后,都会提示后续的操作步骤,最后的kubeadm join命令需要单独记录一下。

# 下面是成功完成第一个控制平面节点初始化的提示信息及后续需要完成的步骤
Your Kubernetes control-plane has initialized successfully!

# 为了完成初始化操作,管理员需要额外手动完成几个必要的步骤
To start using your cluster, you need to run the following as a regular user:

# 第1个步骤提示, Kubernetes集群管理员认证到Kubernetes集群时使用的kubeconfig配置文件
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

# 我们也可以不做上述设定,而使用环境变量KUBECONFIG为kubectl等指定默认使用的kubeconfig;
Alternatively, if you are the root user, you can run:

export KUBECONFIG=/etc/kubernetes/admin.conf

# 第2个步骤提示,为Kubernetes集群部署一个网络插件,具体选用的插件则取决于管理员;
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/

# 第3个步骤提示,向集群添加额外的控制平面节点,但本文会略过该步骤,并将在其它文章介绍其实现方式。
You can now join any number of the control-plane node running the following command on each as root:

# 在部署好kubeadm等程序包的其他控制平面节点上以root用户的身份运行类似如下命令,
# 命令中的hash信息对于不同的部署环境来说会各不相同;该步骤只能在其它控制平面节点上执行;
# 提示:与cri-dockerd结合使用docker-ce作为container runtime时,通常需要为下面的命令
#     额外附加“--cri-socket unix:///run/cri-dockerd.sock”选项;
kubeadm join kubeapi.home.com:6443 --token emvhys.9d7623w48vgm99qz \
      --discovery-token-ca-cert-hash sha256:f13e30d459bf18fa4415f30822a09fe95ab84b213d6dc77d29beb0542bed4cee \
      --control-plane --certificate-key e1996b2c9bf3e60fb75a622c9245539c6d82904fd2dd89f12c6efe459edd0c5b

# 因为在初始化命令“kubeadm init”中使用了“--upload-certs”选项,因而初始化过程会自动上传添加其它Master时用到的数字证书等信息;
# 出于安全考虑,这些内容会在2小时之后自动删除;
Please note that the certificate-key gives access to cluster sensitive data, keep it secret!
As a safeguard, uploaded-certs will be deleted in two hours; If necessary, you can use
"kubeadm init phase upload-certs --upload-certs" to reload certs afterward.

# 第4个步骤提示,向集群添加工作节点
Then you can join any number of worker nodes by running the following on each as root:

# 在部署好kubeadm等程序包的各工作节点上以root用户运行类似如下命令;
# 提示:与cri-dockerd结合使用docker-ce作为container runtime时,通常需要为下面的命令
#     额外附加“--cri-socket unix:///run/cri-dockerd.sock”选项;
kubeadm join kubeapi.home.com:6443 --token emvhys.9d7623w48vgm99qz \
      --discovery-token-ca-cert-hash sha256:f13e30d459bf18fa4415f30822a09fe95ab84b213d6dc77d29beb0542bed4cee

另外,kubeadm init命令完整参考指南请移步官方文档,地址为https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm-init/。

设定kubectl

kubectl是kube-apiserver的命令行客户端程序,实现了除系统部署之外的几乎全部的管理操作,是kubernetes管理员使用最多的命令之一。kubectl需经由API server认证及授权后方能执行相应的管理操作,kubeadm部署的集群为其生成了一个具有管理员权限的认证配置文件/etc/kubernetes/admin.conf,它可由kubectl通过默认的“$HOME/.kube/config”的路径进行加载。当然,用户也可在kubectl命令上使用--kubeconfig选项指定一个别的位置。

下面复制认证为Kubernetes系统管理员的配置文件至目标用户(例如当前用户root)的家目录下:

mkdir ~/.kube
cp /etc/kubernetes/admin.conf  ~/.kube/config
部署网络插件

Kubernetes系统上Pod网络的实现依赖于第三方插件进行,这类插件有近数十种之多,较为著名的有flannel、calico、canal和kube-router等,简单易用的实现是为CoreOS提供的flannel项目。下面的命令用于在线部署flannel至Kubernetes系统之上,我们需要在初始化的第一个master节点k8s-master01上运行如下命令,以完成部署。

kubectl apply -f https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml

而后使用如下命令确认其输出结果中Pod的状态为“Running”,类似如下命令及其输入的结果所示:

kubectl get pods -n kube-flannel

上述命令应该会得到类似如下输出,这表示kube-flannel已然正常运行。

NAME                   READY   STATUS   RESTARTS   AGE
kube-flannel-ds-65l9z   1/1     Running   0         5m
验证master节点已经就绪
kubectl get nodes

上述命令应该会得到类似如下输出,这表示k8s-master01节点已经就绪。

NAME                     STATUS   ROLES           AGE   VERSION
k8s-master01.home.com   Ready   control-plane   6m   v1.28.2
添加节点到集群中

下面的两个步骤,需要分别在k8s-node01、k8s-node02和k8s-node03上各自完成。

  • 若未禁用Swap设备,编辑kubelet的配置文件/etc/default/kubelet,设置其忽略Swap启用的状态错误,内容如下: KUBELET_EXTRA_ARGS="--fail-swap-on=false"
  • 将节点加入第二步中创建的master的集群中,要使用主节点初始化过程中记录的kubeadm join命令;
kubeadm join kubeapi.home.com:6443 --token emvhys.9d7623w48vgm99qz \
      --discovery-token-ca-cert-hash sha256:f13e30d459bf18fa4415f30822a09fe95ab84b213d6dc77d29beb0542bed4cee \
      --cri-socket unix:///run/cri-dockerd.sock
验证节点添加结果

在每个节点添加完成后,即可通过kubectl验证添加结果。下面的命令及其输出是在所有的三个节点均添加完成后运行的,其输出结果表明三个Worker Node已经准备就绪。

kubectl get nodes

其输出应为:

NAME                     STATUS   ROLES           AGE   VERSION
k8s-master01.home.com   Ready   control-plane   10m   v1.28.2
k8s-node01.home.com     Ready   <none>         9m   v1.28.2
k8s-node02.home.com     Ready   <none>         7m   v1.28.2
k8s-node03.home.com     Ready   <none>         5m   v1.28.2

API资源规范

常见的API资源

五个一级字段

  • apiVersion:资源类型所属的群组及其版本号
  • kind:资源类型本身的名称,例如Pod,Service
  • metadata:对象元数据
  • spec:期望的状态,终态声明
  • status:实际状态,由控制器维护和定义

API资源组

API为了便于管理,根据其功能所属类别,API资源被分成了多个小组,每个组只包含一部分资源类型,这样组称为APIGroup,每个group独立进行版本标识

[root@k8s-master01 ~]# kubectl api-versions
group_name/version
admissionregistration.k8s.io/v1
apiextensions.k8s.io/v1
apiregistration.k8s.io/v1
apps/v1
authentication.k8s.io/v1
authorization.k8s.io/v1
autoscaling/v1
autoscaling/v2
batch/v1
certificates.k8s.io/v1
coordination.k8s.io/v1
discovery.k8s.io/v1
events.k8s.io/v1
flowcontrol.apiserver.k8s.io/v1beta2
flowcontrol.apiserver.k8s.io/v1beta3
kuboard.cn/v1
metrics.k8s.io/v1beta1
network.kubesphere.io/v1alpha1
network.kubesphere.io/v1alpha2
networking.k8s.io/v1
node.k8s.io/v1
policy/v1
rbac.authorization.k8s.io/v1
scheduling.k8s.io/v1
storage.k8s.io/v1
v1

查看资源组内包含的资源类型

#查看所有的资源类型
[root@k8s-master01 ~]# kubectl api-resources
NAME                              SHORTNAMES   APIVERSION                             NAMESPACED   KIND
bindings                                       v1                                     true         Binding
componentstatuses                 cs           v1                                     false        ComponentStatus
configmaps                        cm           v1                                     true         ConfigMap
endpoints                         ep           v1                                     true         Endpoints
events                            ev           v1                                     true         Event
limitranges                       limits       v1                                     true         LimitRange
namespaces                        ns           v1                                     false        Namespace
nodes                             no           v1                                     false        Node
......
......
......
#查看指定组内的资源类型
[root@k8s-master01 ~]# kubectl api-resources --api-group=apps
NAME                  SHORTNAMES   APIVERSION   NAMESPACED   KIND
controllerrevisions                apps/v1      true         ControllerRevision
daemonsets            ds           apps/v1      true         DaemonSet
deployments           deploy       apps/v1      true         Deployment
replicasets           rs           apps/v1      true         ReplicaSet
statefulsets          sts          apps/v1      true         StatefulSet

查看资源类型有多少个一级字段二级字段

#查看一级字段
[root@k8s-master01 ~]# kubectl explain pod
KIND:       Pod
VERSION:    v1

DESCRIPTION:
    Pod is a collection of containers that can run on a host. This resource is
    created by clients and scheduled onto hosts.
  
FIELDS:
  apiVersion	<string>
    APIVersion defines the versioned schema of this representation of an object.
    Servers should convert recognized schemas to the latest internal value, and
    may reject unrecognized values. More info:
    https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources
......

#查看二级字段
[root@k8s-master01 ~]# kubectl explain pod.spec
......
#查看三级字段
[root@k8s-master01 ~]# kubectl explain pod.spec.containers
......
#查看四级字段
[root@k8s-master01 ~]# kubectl explain pod.spec.containers.image
......

kubectl的三种对象管理机制

指令式命令

在命令行使用kubectl命令选项完成对象管理

[root@k8s-master01 ~]# kubectl create deploment demoapp --image=ikunernetes/demoapp:v1.0 --replcas=3
[root@k8s-master01 ~]# kubectl get namespace
#试运行,并输出yaml文件
[root@k8s-master01 ~]# kubectl create deploment demoapp --image=ikunernetes/demoapp:v1.0 --replcas=3 --dry-run=client -o yaml
#查看API资源组
kubectl api-versions
#查看所有的资源类型
kubectl api-resources
#查看指定GROUP(群组)内包含的资源类型
kubectl api-resources --api-group=GROUP
#查看资源详情状态信息
kubectl describe pods demoapp
kubectl get endpoints demoapp -o yaml

指令式对象配置

从配置文件读取要操作的对象,及对象属性,直接指明操作

[root@k8s-master01 ~]# kubectl create -f pod-demp.yaml

常用的指令式命令

create
delete
edit
replace
get

声明式对象配置

从配置文件读取要操作对象,及对象属性,声明对象终态

#声明式命令,多用于修改类的目的应用至集群上
apply
[root@k8s-master01 ~]# kubectl apply -f kuboard-agent.yaml

评论