二进制文件部署k8s方式(4)

二进制文件部署k8s方式(4)

Master节点_kube-apiserver部署

下载二进制安装包

复制代码
https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.26.md#v1183

里面能看到很多安装包,我们针对master节点只需要下载Server Binaries

各安装包对应内容分别为

Client Binaries(客户端二进制文件)
  • kubectl - Kubernetes 命令行工具,用于管理集群
  • 平台版本:Linux、Windows、macOS(amd64/arm64)
Server Binaries(服务器端二进制文件)

核心控制平面组件:

  • kube-apiserver - API 服务器,集群的前端入口
  • kube-controller-manager - 运行各种控制器进程
  • kube-scheduler - 负责调度 Pod 到节点
  • kube-proxy - 网络代理,实现 Service 概念
  • kubelet - 节点代理,管理 Pod 和容器
  • 平台:Linux(amd64/arm64)
Node Binaries(节点二进制文件)

最小化节点运行所需:

  • kubelet - 必须在每个节点上运行
  • kube-proxy - 可选,但通常需要
  • 平台:Linux(amd64/arm64)
Container Images(容器镜像)

所有核心组件的容器化版本:

  • kube-apiserver
  • kube-controller-manager
  • kube-scheduler
  • kube-proxy
  • 镜像仓库:registry.k8s.io
Source Code(源代码)
  • 完整的 Kubernetes 项目源代码
  • 构建脚本和配置
  • 文档和示例

下载后再上传到master节点

解压二进制包

创建k8s安装目录

master1节点执行

bash 复制代码
mkdir -p /opt/kubernetes/{bin,cfg,ssl,logs}

解压

bash 复制代码
tar zxvf kubernetes-server-linux-amd64.tar.gz
bash 复制代码
cd kubernetes/server/bin

master节点主要安装kube-apiserver、kube-scheduler和kube-controller-manager三个服务

bash 复制代码
cp kube-apiserver kube-scheduler kube-controller-manager /opt/kubernetes/bin

安装kubectl服务

bash 复制代码
cp kubectl /usr/bin/

同步到其他master节点

bash 复制代码
NODES='master2 master3'; \
for NODE in $NODES; \
do \
ssh $NODE "mkdir -p /opt/kubernetes/{bin,cfg,ssl,logs}"; \
scp kube-apiserver $NODE:/opt/kubernetes/bin;\
scp kube-scheduler $NODE:/opt/kubernetes/bin;\
scp kube-controller-manager $NODE:/opt/kubernetes/bin;\
scp kubectl $NODE:/usr/bin;\
done

kube-apiserver部署

生成ca证书

进入证书存放目录

均只在master1执行

bash 复制代码
cd /opt/kubernetes/ssl

创建CA配置文件

json 复制代码
cat > ca-config.json << EOF 
{
  "signing": {
    "default": {
      "expiry": "876000h"
    },
    "profiles": {
      "kubernetes": {
        "usages": [
            "signing",
            "key encipherment",
            "server auth",
            "client auth"
        ],
        "expiry": "876000h"
      }
    }
  }
}
EOF

创建CA证书签名请求文件

json 复制代码
cat > ca-csr.json   << EOF 
{
  "CN": "kubernetes",
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "CN",
      "ST": "Beijing",
      "L": "Beijing",
      "O": "Kubernetes",
      "OU": "Kubernetes-manual"
    }
  ],
  "ca": {
    "expiry": "876000h"
  }
}
EOF

以上俩文件作用在《二进制文件方式部署k8s(2)》中有所提及

生成证书

bash 复制代码
cfssl gencert -initca ca-csr.json | cfssljson -bare ca - && ls *.pem
签发kube-apiserver证书

在master1执行

创建证书申请文件

json 复制代码
cat > kube-apiserver-csr.json<< EOF
{
    "CN": "kube-apiserver",
    "hosts": [
        "10.96.0.1",
        "127.0.0.1",
        "192.168.153.200", 		//这里预留一条IP为后续负载均衡做准备
        "192.168.153.161",
        "192.168.153.162",
        "192.168.153.163",
        "192.168.153.181",
        "192.168.153.182",
        "kubernetes",
        "kubernetes.default",
        "kubernetes.default.svc",
        "kubernetes.default.svc.cluster",
        "kubernetes.default.svc.cluster.local"
    ],
    "key": {
    "algo": "rsa",
    "size": 2048
  },
    "names": [
    {
      "C": "CN",
      "ST": "Beijing",
      "L": "Beijing",
      "O": "Kubernetes",
      "OU": "Kubernetes-manual"
    }
  ]
}
EOF

生成证书

bash 复制代码
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes kube-apiserver-csr.json | cfssljson -bare kube-apiserver && ls kube-apiserver*pem
生成apiserver聚合证书

在master1执行

创建证书申请文件

json 复制代码
cat > front-proxy-ca-csr.json  << EOF 
{
  "CN": "kubernetes",
  "key": {
     "algo": "rsa",
     "size": 2048
  },
  "ca": {
    "expiry": "876000h"
  }
}
EOF
bash 复制代码
cfssl gencert -initca front-proxy-ca-csr.json | cfssljson -bare front-proxy-ca - && ls front-proxy-ca*.pem

证书签发

json 复制代码
cat > front-proxy-client-csr.json  << EOF 
{
  "CN": "front-proxy-client",
  "key": {
     "algo": "rsa",
     "size": 2048
  }
}
EOF
bash 复制代码
cfssl gencert -ca=front-proxy-ca.pem -ca-key=front-proxy-ca-key.pem -config=ca-config.json -profile=kubernetes front-proxy-client-csr.json | cfssljson -bare front-proxy-client && ls front-proxy-client*pem

创建ServiceAccount Key

ServiceAccount Key(服务账户密钥) 是 Kubernetes 中用于身份验证和授权的重要凭证

bash 复制代码
openssl genrsa -out /opt/kubernetes/ssl/sa.key 2048
bash 复制代码
openssl rsa -in /opt/kubernetes/ssl/sa.key -pubout -out /opt/kubernetes/ssl/sa.pub

证书拷贝到其他节点

bash 复制代码
NODES='master2 master3 worker1 worker2'; \
for NODE in $NODES; \
do \
for FILE in ca-key.pem  ca.pem  front-proxy-ca-key.pem  front-proxy-ca.pem  front-proxy-client-key.pem  front-proxy-client.pem  kube-apiserver-key.pem  kube-apiserver.pem sa.key sa.pub; \
do \
scp /opt/kubernetes/ssl/${FILE} $NODE:/opt/kubernetes/ssl/${FILE};\
done \
done

创建配置文件

各master节点执行

bash 复制代码
cat > /opt/kubernetes/cfg/kube-apiserver.conf << EOF
KUBE_APISERVER_OPTS="--v=2  \\
      --allow-privileged=true  \\
      --bind-address=0.0.0.0  \\
      --secure-port=6443  \\
      --advertise-address=192.168.153.161 \\ 	#master节点ip
      --service-cluster-ip-range=10.96.0.0/12  \\
      --service-node-port-range=30000-32767  \\
      --etcd-servers=https://192.168.153.161:2379,https://192.168.153.162:2379,https://192.168.153.163:2379 \\
      --etcd-cafile=/opt/etcd/ssl/ca.pem  \\
      --etcd-certfile=/opt/etcd/ssl/etcd.pem  \\
      --etcd-keyfile=/opt/etcd/ssl/etcd-key.pem  \\
      --client-ca-file=/opt/kubernetes/ssl/ca.pem  \\
      --tls-cert-file=/opt/kubernetes/ssl/kube-apiserver.pem  \\
      --tls-private-key-file=/opt/kubernetes/ssl/kube-apiserver-key.pem  \\
      --kubelet-client-certificate=/opt/kubernetes/ssl/kube-apiserver.pem  \\
      --kubelet-client-key=/opt/kubernetes/ssl/kube-apiserver-key.pem  \\
      --service-account-key-file=/opt/kubernetes/ssl/sa.pub  \\
      --service-account-signing-key-file=/opt/kubernetes/ssl/sa.key  \\
      --service-account-issuer=https://kubernetes.default.svc.cluster.local \\
      --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname  \\
      --enable-admission-plugins=NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,ResourceQuota  \
      --authorization-mode=Node,RBAC  \\
      --enable-bootstrap-token-auth=true  \\
      --requestheader-client-ca-file=/opt/kubernetes/ssl/front-proxy-ca.pem  \\
      --proxy-client-cert-file=/opt/kubernetes/ssl/front-proxy-client.pem  \\
      --proxy-client-key-file=/opt/kubernetes/ssl/front-proxy-client-key.pem  \\
      --requestheader-allowed-names=aggregator  \\
      --requestheader-group-headers=X-Remote-Group  \\
      --requestheader-extra-headers-prefix=X-Remote-Extra-  \\
      --requestheader-username-headers=X-Remote-User \\
      --enable-aggregator-routing=true"
EOF

其中各条目意思如下

复制代码
-v:日志等级
--etcd-servers:etcd集群地址
--bind-address:监听地址
--secure-port:https 安全端口
--advertise-address:集群通告地址
--allow-privileged:启用授权
--service-cluster-ip-range:Service虚拟 IP地址段
--enable-admission-plugins:准入控制模块
--authorization-mode:认证授权,启用 RBAC 授权和节点自管理
--enable-bootstrap-token-auth:启用 TLS bootstrap 机制
--token-auth-file:bootstrap token文件
--service-node-port-range:Service nodeport类型默认分配端口范围
--kubelet-client-xxx:apiserver 访问 kubelet客户端证书
--tls-xxx-file:apiserver https 证书
--etcd-xxxfile:连接 Etcd 集群证书
--audit-log-xxx:审计日志
1.20版本以上必须添加参数:--service-account-issuer,--service-account-signing-key-file
启动聚合层相关配置:--requestheader-client-ca-file、--proxy-client-cert-file、--proxy-client-key-file、--requestheader-allowed-names、--requestheader-group-headers、--requestheader-extra-headers-prefix、--requestheader-username-headers

设置启动配置

master1节点执行

bash 复制代码
cat > /usr/lib/systemd/system/kube-apiserver.service << EOF
[Unit]
Description=Kubernetes API Server
Documentation=https://github.com/kubernetes/kubernetes
After=network.target

[Service]
EnvironmentFile=/opt/kubernetes/cfg/kube-apiserver.conf
ExecStart=/opt/kubernetes/bin/kube-apiserver \$KUBE_APISERVER_OPTS
Restart=on-failure
RestartSec=10s
LimitNOFILE=65535

[Install]
WantedBy=multi-user.target
EOF

拷贝到其他master节点

bash 复制代码
NODES='master2 master3'; \
for NODE in $NODES; \
do \
scp /usr/lib/systemd/system/kube-apiserver.service $NODE:/usr/lib/systemd/system/;\
done

设置开机启动

所有master节点执行

bash 复制代码
systemctl daemon-reload && systemctl enable --now kube-apiserver

验证

bash 复制代码
systemctl status kube-apiserver
相关推荐
叫致寒吧1 小时前
k8s操作(三)
网络·容器·kubernetes
oMcLin2 小时前
如何在 Red Hat Linux 8 上实现 Kubernetes 自定义资源管理器(CRD)扩展,支持微服务架构
linux·架构·kubernetes
DeepFlow 零侵扰全栈可观测3 小时前
3分钟定位OA系统GC瓶颈:DeepFlow全栈可观测平台实战解析
大数据·运维·人工智能·云原生·性能优化
Knight_AL4 小时前
MinIO 入门实战:Docker 安装 + Spring Boot 文件上传(公有 / 私有)
spring boot·docker·容器
南山nash6 小时前
Docker 网络详细讲解
运维·docker·容器
海鸥816 小时前
K8S中使用 reloader 实现滚动升级
云原生·容器·kubernetes
白驹过隙不负青春6 小时前
Docker-compose部署java服务及前端服务
java·运维·前端·docker·容器·centos
阿常呓语6 小时前
深入理解 Kubernetes 中的探针
云原生·容器·kubernetes
Hui Baby6 小时前
K8S管理GPU等简述
云原生·容器·kubernetes
赵文宇(温玉)7 小时前
Docker是时代发展的产物
运维·docker·容器