【经验分享】容器云运维的知识点

最近忙于备考没关注,有次点进某小黄鱼发现首页出现了我的笔记还被人收费了

虽然我也卖了一些资源,但我以交流、交换 为主,笔记都是免费 给别人看的

由于当时刚刚接触写的并不成熟,为了避免更多人花没必要的钱,所以决定公开出来

欢迎各位大佬指正文章内容

注意1-5都是容器化部署与k8s没有关系,也就是k8s出现之前的技术

记录更改容器源的方法:【这个源已不能用】

shell 复制代码
sed -i 's/registry.k8s.io\/pause:3.6/registry.aliyuncs.com\/google_containers\/pause:3.9/g' /etc/containerd/config.toml#更改

systemctl restart containerd   # 重启

1-5题用软件包ERP.tar.gz ,后续题目用软件包 CICD-Runner.tar.gz

1,容器化部署 MariaDB

注意:centos_7.9.2009.tarERP.tar.gz

注意docker images查看一下镜像加载后的名字,后面写dockerfileFROM需要替换为自己的镜像名字

shell 复制代码
docker load -i centos_7.9.2009.tar 

注意我们这里配置的yum源,与以往的不一样

shell 复制代码
[ERP]
name=ERP
enabled=1
gpgcheck=0
baseurl=file:///root/yum

因为这个yum源是给容器 准备的,等会dockerfile运行会将它复制到容器

编写mysql初始化脚本(这个也是要去容器中运行的)

shell 复制代码
#!/bin/bash
mysql_install_db --user=root
mysqld_safe --user=root &
sleep 8
mysqladmin -u root password 'tshoperp'
mysql -uroot -ptshoperp -e "grant all on *.* to 'root'@'%' identified by 'tshoperp'; flush privileges;"
mysql -uroot -ptshoperp -e "create database jsh_erp;use jsh_erp; source /opt/jsh_erp.sql;"

编写docker_mariadb(以下从字面意思都能读懂,不多解释)
这个是错的

dockerfile 复制代码
vi docker_mariadb
# 错的错的错的这个是错的
FROM centos:7.9.2009									# 抽取镜像
MAINTAINER troml1788									# 维护者信息
RUN rm -rf /etc/yum.repos.d/*					# 清空自带的源
COPY local.repo /etc/yum.repos.d/			# 复制我们准备的本地仓库
RUN mkdir /root/yum										# 创建本地仓库
COPY yum /root/yum										# 复制离线包到仓库
ENV LC_ALL en_US.UTF-8								# 设置环境变量LC_ALL为en_US.UTF-8,这是为了支持多语言字符集
RUN yum -y install mariadb-server			# 安装数据库
COPY jsh_erp.sql /opt/								# 复制数据库备份文件
COPY mysql_init.sh /opt/							# 复制数据库初始化脚本
RUN bash /opt/mysql_init.sh						# 执行数据库初始化脚本
EXPOSE 3306														# 开放3306端口
CMD ["mysqld_safe","--user=root"]			# 执行mysqld_safe命令,以root用户执行mysql

这个是对的

dockerfile 复制代码
FROM centos:7.9.2009
MAINTAINER troml1788
RUN rm -rf /etc/yum.repos.d/*
COPY local.repo /etc/yum.repos.d/
COPY jsh_erp.sql /opt/
COPY yum /root/yum
COPY mysql_init.sh /opt/
ENV LC_ALL en_US.UTF-8
RUN yum install -y mariadb-server
RUN bash /opt/mysql_init.sh
EXPOSE 3306
CMD ["mysqld_safe","--user=root"]

需要注意的是对应关系,这个docker_mariadb一定要和mysql_init.shyum文件夹、local.repojsh_erp.sql在同一级下

因为要复制他们到使用centos7创建的容器中

shell 复制代码
docker build \
-t erp-mysql:v1.0 \
-f docker_mariadb .
shell 复制代码
docker images

总结本题的操作:

加载了centos7镜像到docker中,它将被用来创建镜像 ,也可直接启动一个容器

为新建的容器编写local.repo仓库源和mysql_init.sh数据库初始化脚本

使用Docker构建一个Docker镜像(基于dockerfile和centos7镜像)

构建了一个erp-mysql:v1.0(名字:版本)镜像

这个镜像将被用来启动出一个容器

2,容器化部署Redis

编写dockerfile
这个是错的

dockerfile 复制代码
vi docker_redis
# 错的错的错的这个是错的
FROM centos:centos7.9.2009
MAINTAINER troml1788
RUN rm -rf /etc/yum.repos.d/*
COPY local.repo /etc/yum.repos.d/
RUN mkdir /root/yum
COPY yum /root/yum
RUN yum install -y redis
# 修改文件内容
RUN sed -i 's/127.0.0.1/0.0.0.0/g' /etc/redis.conf
RUN sed -i 's/protected-mode yes/protected-mode no/g' /etc/redis.conf
EXPOSE 6379
# 启动 Redis并应用修改后的文件
CMD ["/usr/bin/redis-server","/etc/redis.conf"] 

报错点在:

如果没有下面添加的那一行,就没有开启认证服务

那么应用程序来认证,但是这边并不提供认证服务,就会导致现象:

账户密码错误的时候会提示错误,但是账户密码正确时会提示请求错误

shell 复制代码
FROM centos:centos7.9.2009
MAINTAINER troml1788
RUN rm -rf /etc/yum.repos.d/*
COPY local.repo /etc/yum.repos.d/
COPY yum /root/yum
RUN yum install -y redis
RUN sed -i 's/127.0.0.1/0.0.0.0/g' /etc/redis.conf
RUN sed -i 's/protected-mode yes/protected-mode no/g' /etc/redis.conf
RUN echo "requirepass tshoperp" >> /etc/redis.conf  # 添加这一行
EXPOSE 6379
CMD ["/usr/bin/redis-server","/etc/redis.conf"]

正确内容

dockerfile 复制代码
FROM centos:7.9.2009
MAINTAINER troml1788
RUN rm -rf /etc/yum.repos.d/*
COPY local.repo /etc/yum.repos.d/
COPY yum /root/yum
RUN yum install -y redis
RUN sed -i 's/127.0.0.1/0.0.0.0/g' /etc/redis.conf
RUN sed -i 's/protected-mode yes/protected-mode no/g' /etc/redis.conf
RUN echo "requirepass tshoperp" >> /etc/redis.conf
EXPOSE 6379
CMD ["/usr/bin/redis-server","/etc/redis.conf"]
shell 复制代码
docker build \
-t erp-redis:v1.0 \
-f docker_redis .
shell 复制代码
docker images

这里只是定制了一个redis镜像,redis一般是多节点运行的

题目只要求我们构建,并没有要求我们构建redis主从,因此完工

3,容器化部署Nginx

nginx是一个轻量级的HTTP服务器
这个是错的

dockerfile 复制代码
# 错的错的错的这个是错的
FROM centos:centos7.9.2009
MAINTAINER troml1788
RUN rm -rf /etc/yum.repos.d/*
COPY local.repo /etc/yum.repos.d/
COPY yum /root/yum
RUN yum install -y nginx
COPY nginx/nginx.conf /etc/nginx/nginx.conf
COPY nginx/app.tar.gz /
RUN tar -zxvf app.tar.gz 
RUN /bin/bash -c 'echo init ok'
EXPOSE 80
CMD ["nginx","-g","daemon off;"]

正确内容

dockerfile 复制代码
FROM centos:7.9.2009
MAINTAINER troml1788
RUN rm -rf /etc/yum.repos.d/*
COPY local.repo /etc/yum.repos.d/
COPY yum /root/yum
RUN yum install -y nginx
COPY nginx/nginx.conf /etc/nginx/nginx.conf
COPY nginx/app.tar.gz /
RUN tar -zxvf app.tar.gz
RUN /bin/bash -c 'echo init ok'
EXPOSE 80
CMD ["nginx","-g","daemon off;"]
shell 复制代码
docker build \
-t erp-nginx:v1.0 \
-f docker_nginx .

4,容器化部署ERP

ERP是企业资源计划,就是工厂里面生产用的系统,作为我们本次练手部署的应用服务
这个是错的

dockerfile 复制代码
vi docker_erp

FROM centos:7.9.2009
MAINTAINER troml
COPY app.jar /root
RUN mkdir -p /root/yum
COPY yum /root/yum
RUN rm -rfv /etc/yum.repos.d/*
COPY local.repo /etc/yum.repos.d/
RUN yum install -y java-1.8.0-openjdk java-1.8.0-openjdk-devel
EXPOSE 9999
# 启动就运行app.jar
CMD java -jar /root/app.jar

正确内容

dockerfile 复制代码
FROM centos:7.9.2009
MAINTAINER troml1788
COPY app.jar /root
COPY yum /root/yum
RUN rm -rf /etc/yum.repos.d/*
COPY local.repo /etc/yum.repos.d/
RUN yum install -y java-1.8.0-openjdk java-1.8.0-openjdk-devel
EXPOSE 9999
CMD java -jar /root/app.jar
shell 复制代码
docker build \
-t erp-server:v1.0 \
-f docker_erp .

5,编排部署 ERP

注意这里:

编排 也就是容器化部署应用服务,k8s做的就是很强大的统一编排功能,这里 我们做的是docker编排

编写docker-compose.yaml 文件

就是这里出现了问题。错误保留,正确往下看
这个是错的

yaml 复制代码
version: '3.8'
services:
  mysql:
    image: erp-mysql:v1.0
  redis:
    image: erp-redis:v1.0
  erp:
    image: erp-server:v1.0
  nginx:
    image: erp-nginx:v1.0
    ports:
      - "8888:80"  # 将宿主机的 8888 端口映射到容器的 80 端口

错误点在于 :我们之前用的mysql做了资源名称,导致映射成了mysql,而应用程序中写的连接是erp-mysql,这就是连不上数据库的原因

不知道为什么,vi中写yaml总是说没对齐(所以建议用本地VSCode写好后站上去)
正确内容

shell 复制代码
version: '3.8'
services:
  erp-mysql:
    image: erp-mysql:v1.0
  erp-redis:
    image: erp-redis:v1.0
  erp-server:
    image: erp-server:v1.0
  erp-nginx:
    image: erp-nginx:v1.0
    ports:
      - "8888:80"

Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具,它使用一个单一的配置文件(通常称为 docker-compose.yaml 文件)来定义整个应用程序

在我们的环境中,他和harbor仓库一起按照

就是说,它会自动寻找docker-compose.yaml ,如果起了其它名字,需要docker-compose -f xxx.yaml up来运行

shell 复制代码
## 按两下table
[root@k8s-master-node1 ~]# docker-		
docker-compose  docker-init     docker-proxy 

运行yaml文件

Docker 容器中,通常在 docker-compose.yml 文件中声明的各个服务

shell 复制代码
docker-compose up -d

这时,如果不出意外的话,就可以访问到ERP工厂了,不过我们的app.jar出了点问题【上面已修复】

小总结:

以上完整地容器化部署 了一个项目,刚刚启动的这些服务被称为容器

在docker中,容器是最小部署单位

在k8s中,pod是最小部署单位,pod包含多个容器,而且多个pod共享资源(同一台裸机或虚拟机)

完美解决问题:

不是app.jar包的问题,而是我们操作出现了问题

shell 复制代码
部署redis						# 没开启认证
docker-compose.yaml	# 映射名起错了

展示:

账户admin 密码123456

注意:这样部署的服务重启一下就没了,如果需要他自动重启,那么我们就要按下面写:

yaml 复制代码
[root@k8s-master-node1 ERP]# cat docker-compose.yaml 
version: '3.8'
services:
  erp-mysql:
    image: erp-mysql:v1.0
    restart: always
  erp-redis:
    image: erp-redis:v1.0
    restart: always
  erp-server:
    image: erp-sever:v1.0
    restart: always
  erp-nginx:
    image: erp-nginx:v1.0
    ports:
    - "8888:80"
    restart: always

从这里开始就是将应用服务部署到k8s集群中的

虽然集群4G运存就能跑起来

但是到了图形化界面还是有点慢的

我这里给到了13G运存


注意:下列题目该用CICD-Runner.tar.gz

6,部署 GitLab

加载镜像等步骤就不多说了,题目中有

不过比赛时命令不一样,咱们这是自己下载的包用脚本上传


2024-12-14更正:现在k8s版本比较新,用ctr加载

shell 复制代码
docker load -i images.tar

记录一个快速编写kubectl 模板的方法(kubectl在搭建的知识点里有详细介绍)

shell 复制代码
kubectl create --help

创建模板再试运行,直接就写入模板了

shell 复制代码
kubectl create deployment gitlab \
--image=gitlab/gitlab-ce:latest \
--port=80 \
# 试运行,不实际创建资源
--dry-run -oyaml > gitlab.yaml

kubectl create service nodeport gitlab \
--tcp=80:80 \
--dry-run \
-oyaml >> gitlab.yaml

修改成下面这样

yaml 复制代码
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: gitlab
  name: gitlab
  namespace: gitlab-ci # 添加要部署的命名空间,等会记得先创建
spec:
  replicas: 1
  selector:
    matchLabels:
      app: gitlab
  template:
    metadata:
      labels:
        app: gitlab
    spec:
      containers:
      - image: gitlab/gitlab-ce:latest
        imagePullPolicy: IfNotPresent #添加镜像拉取策略,本地有这个镜像就不用再拉了
        name: gitlab-ce
        ports:
        - containerPort: 80
        env:
        - name: GITLAB_ROOT_PASSWORD    # 添加root用户密码
# 注意这里,因为我们用的最新版gitlab镜像,严格要求不能是弱密码
# 所以此处先不按题目的admin@123来,比赛时要填admin@123
          value: QazWsxEdc781 # 设置root用户密码
#下面这几个不指定也可以,本来就是默认的
        - name: GITLAB_HOST # 添加master主机
          value: 192.168.100.10 # 添加IP
        - name: GITLAB_PORT 
          value: "80"
---	# 多个资源之间要用三个横线隔开
apiVersion: v1
kind: Service
metadata:
  creationTimestamp: null
  labels:
    app: gitlab
  name: gitlab
  namespace: gitlab-ci
spec:
  ports:
  - name: 80-80
    port: 80
    protocol: TCP
    targetPort: 80
    nodePort: 30880 #添加暴漏端口,不然会随机一个
  selector: # 选择器很重要,它会找这个gitlab然后暴漏它的端口
    app: gitlab
  type: NodePort

回想一下命名空间的作用

shell 复制代码
kubectl create namespace gitlab-ci
shell 复制代码
kubectl apply -f gitlab.yaml 
shell 复制代码
kubectl get pod,svc -n gitlab-ci

等待一会

发现出错了

shell 复制代码
[root@k8s-master-node1 CIDI-Runner]# kubectl delete pod gitlab-7cb8c45dbc-fvldt -n gitlab-ci
pod "gitlab-7cb8c45dbc-fvldt" deleted

访问

注意:出现这个不要急,因为服务要一个一个启动

出现了,输入我们的admin/QazWsxEdc781

开始上传demo-2048项目

点击新建项目

点击导入项目

有些版本会出现这种情况(常见于新版)

如果有上传按钮跳过蓝色字样的步骤【直接去看第七步】

解决方法

允许上传

继续上传

选择导入

就可以导入了

上传项目

出现404或者下图Error都不要急,等一会刷新就好

20s左右没恢复基本就是出问题了,看虚拟机配置有没有给足

本题完成

后面以图形化操作居多

7,部署 GitLab Runner

首先查看我们的gitlab-runner 和 gitlab镜像版本

然后安装heml(安装过的可以不用做)

获取令牌

为GitLab Runner 创建持久化构建缓存目录 /home/gitlab-runner/ci-build-cache ,并将其注册到 GitLab

修改values.yaml(values.yaml在gitab-runner.tar.gz压缩包里,解压后进去修改,改完不用动文件位置)

shell 复制代码
      [[runners.kubernetes.volumes.host_path]]
        name = "cache"
        mount_path = "/home/gitlab-runner/ci-build-cache"
        host_path = "/opt/cache"
      [[runners.kubernetes.volumes.host_path]]
        name = "docker"
        mount_path = "/var/run/docker.sock"
        read_only = true
        host_path = "/var/run/docker.sock"
shell 复制代码
helm install --namespace gitlab-ci gitlab-runner \
 --set gitlabUrl=http://192.168.100.10:30880/ \
 --set runnerRegistrationToken=qCcz8c2MSnxdx5_RxbGz \
 --set runners.tags=k8s-runner \
 --set rbac.create=true .

刷新界面就能看到

如果没有,可能是入栈流量没开启(此为刷新后没有runner的步骤)

先删除之前搞的,然后按照步骤重新来

shell 复制代码
helm uninstall -n gitlab-ci gitlab-runner

本题完成

8,部署 GitLab Agent

将 Kubernetes 集群添加到 GitLab 项目中指定名称和命名空间

我们进圈起来那个

shell 复制代码
kubectl exec -it -n gitlab-ci gitlab-5d568c5b-g44lz /bin/bash

1,检查组件:

如果没启动,去vi /etc/gitlab/gitlab.rb

修改

# gitlab_rails['gitlab_kas_enabled'] = true

并取消注释,这里我们启动了就不管了

2,修改gitlab.yml

shell 复制代码
find /opt/* -name gitlab.yml
# 回显下面那个文件,编辑他
/opt/gitlab/embedded/service/gitlab-rails/config/gitlab.yml
vi /opt/gitlab/embedded/service/gitlab-rails/config/gitlab.yml

这里修改为master的节点,也就是harbor仓库和部署gitlab的节点

修改完后重启

不修改等会流水线会报错找不到那个gitlab-xxxxx

ctrl + D 返回master节点

回到项目(准备创建目录)


创建的目录

shell 复制代码
.gitlab/agents/kubernetes-agent

再创建一个空file,在我们刚刚创建的目录下

输入名字保存

加入集群

shell 复制代码
helm install gitlab-agent --generate-name \
    --namespace gitlab-ci \
    --set config.token=glagent-z5XMY8gEGxEdFa6AtNJ6SLWv3C2n8z1gapJ-EgswTb6Uz-ncQw \
    --set config.kasAddress=ws://192.168.100.10:30880/-/kubernetes-agent/

此时注意终端所处位

开始执行部署命令

刷新界面(注意这里:有时响应比较慢,等一会就好了,大约30秒)

本题完成

注意:由于2024年阿里云挂了,在之前,我们执行加入集群后会拉去15.1.0

以前是能成功拉起来的,阿里云挂了以后就拉不下来啦

解决方法:给镜像重新打个标签

shell 复制代码
docker tag registry.gitlab.com/gitlab-org/cluster-integration/gitlab-agent/agentk:v15.1.0 registry.gitlab.com/gitlab-org/cluster-integration/gitlab-agent/agentk:v15.0.0

或者修改yaml文件,但是这种方法更简单粗暴

小记一下:

如果遇到pod出现诸如:ImagePullBackOff...这样的错误,可使用下面命令排错

shell 复制代码
kubectl describe pod XXXX -n gitlab-ci

删除pod重建

shell 复制代码
kubectl delete pod XXXX -n gitlab-ci

9,构建 CI/CD

本题注意分支,所有操作均在drone分支下操作

进入drone分支,现成的yaml文件

修改demo-2048.yaml(改成harbor地址)

然后配置文件已经写了,现在需要去harbor创建仓库

登陆

创建

完成

下面这个文件已经存在于gitlab的仓库内,切换分支进行修改

修改dockerfile

必做步骤:

向harbor仓库推送镜像

shell 复制代码
docker login 192.168.100.10
docker tag tomcat:8.5.64-jdk8 192.168.100.10/library/tomcat:8.5.64-jdk8
docker push 192.168.100.10/library/tomcat:8.5.64-jdk8

可能会遇到权限不足的问题

shell 复制代码
kubectl get clusterroles
shell 复制代码
为用户 "system:serviceaccount:gitlab-ci:default" 授予 admin 角色:

kubectl create clusterrolebinding gitlab-ci-admin \
--clusterrole=admin \
--serviceaccount=gitlab-ci:default

写一个流水线脚本(这里完全不会写,复制的)

yaml 复制代码
variables:
    MAVEN_OPTS: "-Dmaven.repo.local=/home/gitlab-runner/ci-build-cache/.m2/repository"
    DOCKER_CONFIG: |
        {
        "insecure-registries": [
            "192.168.100.10"
        ]
        }
stages:
    - project_build
    - image_build
    - deploy

project_build:
    stage: project_build
    image: maven:3.6-jdk-8
    tags:
        - k8s-runner
    script:
        - echo 'nameserver 10.10.1.2' >> /etc/resolv.conf
        - echo 'nameserver 114.114.114.114' >> /etc/resolv.conf
# 新增配置阿里源
        - mkdir -p /home/gitlab-runner/ci-build-cache/
        - echo "<settings><mirrors><mirror><id>alimaven</id><mirrorOf>central</mirrorOf><url>https://maven.aliyun.com/repository/central</url></mirror></mirrors></settings>" > /home/gitlab-runner/ci-build-cache/settings.xml
        - mvn package install -B -DskipTests -s /home/gitlab-runner/ci-build-cache/settings.xml
        - ls target
        # 这一步是因为不知道为啥构建出来的是2048.war
        - mv target/2048.war target/demo-2048.war
        - jar -xf target/demo-2048.war
        - cp -rvf target /home/gitlab-runner/ci-build-cache/
        - ls /home/gitlab-runner/ci-build-cache/target/

image_build:
    stage: image_build
    image: docker:18.09.7
    tags:
        - k8s-runner
    variables:
        DOCKER_DRIVER: overlay2
    services:
        - name: docker:18.09.7-dind
          entrypoint: ["dockerd-entrypoint.sh"]
          command: ["--insecure-registry","192.168.100.10"]
    script:
        - mkdir -p /etc/docker
        - mkdir -p /usr/lib/systemd/system/
        - echo ExecStart=/usr/bin/dockerd --insecure-registry=192.168.100.10 > /usr/lib/systemd/system/docker.service
        - cat /usr/lib/systemd/system/docker.service
        - echo "$DOCKER_CONFIG" > /etc/docker/daemon.json
        - cat /etc/docker/daemon.json
        - echo 'Harbor12345' > password.txt
        - cat password.txt | docker login -u admin --password-stdin 192.168.100.10
        - mv Dockerfiles/Dockerfile .
        - ls /home/gitlab-runner/ci-build-cache/
        - cp -rvf /home/gitlab-runner/ci-build-cache/target/2048 .
        - docker build -t demo:latest .
        - docker tag demo:latest 192.168.100.10/demo/demo:latest
        - docker push 192.168.100.10/demo/demo:latest

deploy:
    image: bitnami/kubectl:1.22
    stage: deploy
    tags:
        - k8s-runner
    script:
        - kubectl apply -f template/demo-2048.yaml
        - kubectl apply -f template/service.yaml

保存文件直接开始流水线

如果报错,查看下述文章:

https://www.yuque.com/wangziyang-5wpbr/rx60zg/rbhlexqumu6ralce?singleDoc# 《流水线排错记录》

运行结束

持久化缓存目录也成功了

访问masterIP:8889就可以玩游戏了

排错完毕,特此记录

如果重启后,这个pod错误了,那么删除pod,直接就会自动新建pod

启动后发现有问题

删除后,自动又创建了一个,然后又可以玩了


下面这三题太超纲了,暂时放弃

10 服务网格:创建 VirtualService

实验环境:运行中的 Kubernetes 集群,Istio 已经被正确安装 这个题要确定在搭建过程中istio部署成功,且启用自动注入 Envoy 代理作为 Sidecar

相关推荐
大树883 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠3 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质3 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
SM177152118383 天前
NSK紧凑型FA系列丝杠技术详解
经验分享·规格说明书
Inhand陈工3 天前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信
酣大智3 天前
ARP代理--工作原理
运维·网络·arp·arp代理
shushangyun_3 天前
2026年快消品B2B系统推荐:支持终端门店订货、促销政策自动化的工具?
java·运维·网络·数据库·人工智能·spring·自动化
施努卡机器视觉3 天前
SNK施努卡侧滑门锁上滑轮总成自动化装配线,从零件到组件,全流程精密制造方案
运维·自动化·制造
AC赳赳老秦3 天前
用 OpenClaw 搭建服务器故障应急响应系统,自动处理 80% 常见运维故障
android·运维·服务器·python·rxjava·deepseek·openclaw
java_cj3 天前
深入kube-apiserver认证机制:从Bearer Token到mTLS的完整认证链解析
linux·运维·服务器·云原生·容器·kubernetes