二进制安装kubernetes 1.24.1

注意:前面有一篇二进制安装kubernetes 1.23.2 的文章,这里的内容和那篇里用的参数大部分是一样的,但是scheduler和kubelet的参数有所不同。
点击阅读 二进制安装kubernetes 1.23.2

实验环境

两台机器,vms71和vms72
系统:centos7.4
vms71为master,vms72是worker

1.基本设置

1.安装基本设置

所有节点设置好/etc/hosts,使它们之间能互相解析。

[root@vms7X ~]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.26.71 vms71.rhce.cc vms71
192.168.26.72 vms72.rhce.cc vms72
[root@vms7X ~]# 

在所有节点上关闭swap分区。

[root@vms7X ~]# swapoff -a ; sed -i '/fstab/d' /etc/fstab 
[root@vms7X ~]# 

在所有节点上更新yum源。

[root@vms7X ~]#  rm -rf /etc/yum.repos.d/*  ; wget ftp://ftp.rhce.cc/k8s/* -P /etc/yum.repos.d/
[root@vms7X ~]# yum clean all 
[root@vms7X ~]#

2.安装containerd

在所有机器上安装containerd

[root@vms7X ~]# yum install  containerd.io cri-tools  -y

[root@vms7X ~]# crictl config runtime-endpoint unix:///var/run/containerd/containerd.sock

先生成配置文件/etc/containerd/config.toml。

[root@vms71 ~]# containerd config default > /etc/containerd/config.toml

使用vim编辑器打开/etc/containerd/config.toml。
第一:搜索mirrors,把

     [plugins."io.containerd.grpc.v1.cri".registry.mirrors]

改成

      [plugins."io.containerd.grpc.v1.cri".registry.mirrors]
        [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
          endpoint = ["https://frz7i079.mirror.aliyuncs.com"]

第二:搜索sandbox,把

sandbox_image = "k8s.gcr.io/pause:3.6"
改成
sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.7"

第三:搜索SystemdCgroup,把

          [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
            BinaryName = ""
            CriuImagePath = ""
            CriuPath = ""
            CriuWorkPath = ""
            IoGid = 0
            IoUid = 0
            NoNewKeyring = false
            NoPivotRoot = false
            Root = ""
            ShimCgroup = ""
            SystemdCgroup = false

改成(这里是删除了多余的行,并非是省略没写)

          [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
            SystemdCgroup = true

同步到vms72

[root@vms71 ~]# scp /etc/containerd/config.toml vms72:/etc/containerd/
root@vms72's password: 
config.toml            100% 7155     9.3MB/s   00:00    
[root@vms71 ~]#

在所有节点重启containerd,并设置开机自动启动。

[root@vms7X ~]# systemctl enable containerd ;  systemctl restart containerd

3.加载模块及修改参数

在所有节点上加载模块

[root@vms7X ~]# modprobe overlay ; modprobe br_netfilter

在所有机器上执行下面的命令,目的是系统重启时模块能自动加载。

cat > /etc/modules-load.d/containerd.conf <<EOF
overlay
br_netfilter
EOF

在所有机器上执行下面的命令,目的是实现重启系统后,参数也能继续生效。

cat <<EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF

让上述参数立即生效。

[root@vms7X ~]# sysctl -p /etc/sysctl.d/k8s.conf
[root@vms7X ~]#

4.安装nerdctl

到下面的连接下载最新版的nerdctl,本实验时最新版是0.20.0版本的。
https://github.com/containerd/nerdctl/releases
先在vms71上做,然后同步到vms72即可。

[root@vms71 ~]# tar zxf nerdctl-0.20.0-linux-amd64.tar.gz -C /usr/bin/ nerdctl
[root@vms71 ~]# scp /usr/bin/nerdctl vms72:/usr/bin/
root@vms72's password: 
nerdctl         100%   25MB  88.5MB/s   00:00    
[root@vms71 ~]#

到下面的地址下载nerdctl所需要的cni插件
https://github.com/containernetworking/plugins/releases

先在vms71上做,然后同步到vms72即可。

[root@vms71 ~]# mkdir -p /opt/cni/bin/
[root@vms71 ~]# tar zxf cni-plugins-linux-amd64-v1.1.1.tgz -C /opt/cni/bin/
[root@vms71 ~]# scp -r /opt/cni/ vms72:/opt/

修改/etc/profile,在第二行添加如下两行内容

[root@vms71 ~]# head -3 /etc/profile
# /etc/profile
source <(nerdctl completion bash)
export CONTAINERD_NAMESPACE=k8s.io
[root@vms71 ~]# 

让设置生效

[root@vms71 ~]# source /etc/profile
[root@vms71 ~]# 

5.安装cfssl工具

自行下载最新版的cfssl工具放在/usr/local/bin里。

[root@vms71 ~]# cd /usr/local/bin/
[root@vms71 bin]# ls
cfssl-certinfo_linux-amd64  cfssljson_linux-amd64  cfssl_linux-amd64
[root@vms71 bin]# 
[root@vms71 bin]# 
[root@vms71 bin]# for i in * ; do n=${i%_*} ; mv $i $n; done ; chmod +x *
[root@vms71 bin]# 
[root@vms71 bin]# ls
cfssl  cfssl-certinfo  cfssljson
[root@vms71 bin]# cd
[root@vms71 ~]#

2.配置k8s各组件所需要的证书

在kubernetes里涉及到很多TLS认证,所以需要做大量的证书,这里先归纳一下。
file
此操作在vms71(即master)上操作
在/xx里生成证书,生成的各个证书拷贝到/etc/kubernetes/pki里,

[root@vms71 ~]# mkdir -p /xx  /etc/kubernetes/pki
[root@vms71 ~]#
[root@vms71 ~]# cd /xx
[root@vms71 xx]#

这里/xx作为生产基地,生产各种证书,之后拷贝到对应的目录。

如果对证书认证不理解的话,可以先阅读 https://www.rhce.cc/3625.html

1.搭建ca

步骤1 生成CA配置

[root@vms71 xx]# cfssl print-defaults config > ca-config.json
[root@vms71 xx]#
[root@vms71 xx]# cat ca-config.json
{
    "signing": {
        "default": {
            "expiry": "1680h"
        },
        "profiles": {
            "www": {
                "expiry": "87600h",
                "usages": [
                    "signing",
                    "key encipherment",
                    "server auth",
                    "client auth"
                ]
            }
        }
    }
}

[root@vms71 xx]#

步骤2:生成CA证书请求文件

[root@vms71 xx]# cfssl print-defaults csr > ca-csr.json
[root@vms71 xx]# cat ca-csr.json
{
    "CN": "kubernetes",
    "key": {
        "algo": "rsa",
        "size": 2048
    },
    "names": [
        {
            "C": "CN",
            "ST": "Jiangsu",
            "L": "Xuzhou",
            "O": "kubernetes",
            "OU": "system"
        }
    ]
}

[root@vms71 xx]#

步骤3:生成CA自签名证书

[root@vms71 xx]# cfssl gencert -initca ca-csr.json | cfssljson -bare ca
    ...输出...
[root@vms71 xx]# 

上面命令最后一部分是可以随便写的,只是指定生成证书文件的前缀,比如这里写的是ca,那么生成的证书就是以ca开头的,比如ca.pem是证书,ca-key.pem是私钥,后面的步骤类似。

[root@vms71 xx]# ls
ca-config.json  ca.csr  ca-csr.json  ca-key.pem  ca.pem
[root@vms71 xx]#

[root@vms71 xx]# ls ca*.pem
ca-key.pem  ca.pem
[root@vms71 xx]#

2.front-proxy-ca

这里创建的是聚合层(Aggregation Layer)所需要的证书,如果环境里没有配置聚合层的话,这一步和下一步创建front-proxy-client证书的步骤是不需要的。如果需要,则按下面步骤创建,本次练习并没有使用到聚合层。

拷贝原来ca配置文件和ca证书申请请求文件。

[root@vms71 xx]# cp ca-config.json front-proxy-ca-config.json
[root@vms71 xx]#cp ca-csr.json front-proxy-ca-csr.json
[root@vms71 xx]#

生成front-proxy-ca自签名证书

[root@vms71 xx]# cfssl gencert -initca front-proxy-ca-csr.json | cfssljson -bare front-proxy-ca
    ...输出...
[root@vms71 xx]#

[root@vms71 xx]# ls -1 front*.pem
front-proxy-ca-key.pem
front-proxy-ca.pem
[root@vms71 xx]#

3.front-proxy-client聚合层客户端证书

同上,如果没有使用到聚合层(Aggregation Layer),则不需要做如下命令,如果需要则按如下步骤操作。本练习并没有用到。

[root@vms71 xx]# cfssl print-defaults csr > front-proxy-client-csr.json
[root@vms71 xx]#
[root@vms71 xx]# cat front-proxy-client-csr.json
{
  "CN": "front-proxy-client",
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "CN",
      "ST": "Jiangsu",
      "L": "Xuzhou",
      "O": "kubernetes",
      "OU": "system"
    }
  ]
}

[root@vms71 xx]#

生成聚合层客户端所需要的证书。

[root@vms71 xx]# cfssl gencert -ca=front-proxy-ca.pem -ca-key=front-proxy-ca-key.pem -config=front-proxy-ca-config.json -profile=www front-proxy-client-csr.json | cfssljson  -bare front-proxy-client
    ...输出...
[root@vms71 xx]# 

[root@vms71 xx]# ls -1 front-proxy-client*.pem
front-proxy-client-key.pem
front-proxy-client.pem
[root@vms71 xx]# 

4.etcd服务器端证书

这步骤是用于生成etcd服务器端证书的,etcd需要跟apiserver进行双向TLS(mTLS)认证,etcd服务器端需要证书和私钥,先创建etcd证书请求文件。
[root@vms71 xx]# cfssl print-defaults csr > etcd-csr.json
[root@vms71 xx]#
修改内容如下。

[root@vms71 xx]# cat etcd-csr.json
{
  "CN": "etcd",
  "key": {
    "algo": "rsa",
    "size": 2048
  },
   "hosts": [
     "127.0.0.1",
     "192.168.26.71"
    ],
  "names": [
    {
      "C": "CN",
      "ST": "Jiangsu",
      "L": "Xuzhou",
      "O": "kubernetes",
      "OU": "system"
    }
  ]
}

[root@vms71 xx]#

颁发etcd服务器端所需要的证书。

[root@vms71 xx]# cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=www etcd-csr.json | cfssljson  -bare etcd
    ...输出...
[root@vms71 xx]#

[root@vms71 xx]# ls etcd*.pem
etcd-key.pem  etcd.pem
[root@vms71 xx]#

4.etcd客户端

这步骤是用于生成etcd客户端证书的,当向apiserver向etcd连接时由apiserver向etcd出示的证书。
先生成证书请求文件。

[root@vms71 xx]# cfssl print-defaults csr > etcd-client-csr.json
[root@vms71 xx]# cat etcd-client-csr.json
{
  "CN": "etcd",
  "key": {
    "algo": "rsa",
    "size": 2048
  },
   "hosts": [
     "127.0.0.1",
     "192.168.26.71"
    ],
  "names": [
    {
      "C": "CN",
      "ST": "Jiangsu",
      "L": "Xuzhou",
      "O": "kubernetes",
      "OU": "system"
    }
  ]
}
[root@vms71 xx]# 

颁发证书

[root@vms71 xx]# cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=www etcd-client-csr.json | cfssljson  -bare etcd-client
    ...输出...
[root@vms71 xx]# 
[root@vms71 xx]# ls -1 etcd-client*.pem
etcd-client-key.pem
etcd-client.pem
[root@vms71 xx]#

5.apiserver

k8s的其他组件跟apiserver要进行双向TLS(mTLS)认证,所以apiserver需要有自己的证书,下面生成apiserver所需要的证书请求文件。

[root@vms71 xx]# cfssl print-defaults csr > apiserver-csr.json
[root@vms71 xx]#

改成如下内容。

[root@vms71 xx]# cat apiserver-csr.json
{
  "CN": "kubernetes",
  "key": {
    "algo": "rsa",
    "size": 2048
  },
   "hosts": [
     "127.0.0.1",
     "192.168.26.71",
     "192.168.26.72",
     "10.96.0.1",
     "kubernetes",
     "kubernetes.default",
     "kubernetes.default.svc",
     "kubernetes.default.svc.cluster",
     "kubernetes.default.svc.cluster.local"
    ],
  "names": [
    {
      "C": "CN",
      "ST": "Jiangsu",
      "L": "Xuzhou",
      "O": "kubernetes",
      "OU": "system"
    }
  ]
}

[root@vms71 xx]#

由于该证书后续被 kubernetes master 集群使用,需要将master节点的IP都填上,同时还需要填写 service 网络的第一个IP(这里是10.96.0.1)都填写上去。
生成证书。

[root@vms71 xx]# cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=www apiserver-csr.json | cfssljson -bare apiserver
    ...输出...
[root@vms71 xx]#
[root@vms71 xx]# ls apiserver*.pem -1
apiserver-key.pem
apiserver.pem
[root@vms71 xx]#

6.controller-manager

controller-manager需要跟apiserver进行mTLS认证,生成证书申请请求文件。

[root@vms71 xx]# cfssl print-defaults csr > controller-manager-csr.json
[root@vms71 xx]#
[root@vms71 xx]# cat controller-manager-csr.json
{
  "CN": "system:kube-controller-manager",
  "key": {
    "algo": "rsa",
    "size": 2048
  },
   "hosts": [
     "127.0.0.1",
     "192.168.26.71"
    ],
  "names": [
    {
      "C": "CN",
      "ST": "Jiangsu",
      "L": "Xuzhou",
      "O": "system:kube-controller-manager",
      "OU": "system"
    }
  ]
}

[root@vms71 xx]#

hosts 列表包含所有 kube-controller-manager 节点 IP;CN 为 system:kube-controller-manager,O 为 system:kube-controller-manager,k8s里内置的ClusterRoleBindings system:kube-controller-manager 授权用户 kube-controller-manager所需的权限。后面组件证书都做类似解释。
颁发证书。

[root@vms71 xx]# cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=www controller-manager-csr.json | cfssljson -bare controller-manager
    ...输出...
[root@vms71 xx]#
[root@vms71 xx]# ls -1 control*.pem
controller-manager-key.pem
controller-manager.pem
[root@vms71 xx]#

7.kube-scheduler

kube-scheduler需要跟apiserver进行mTLS认证,生成证书申请请求文件。

[root@vms71 xx]# cfssl print-defaults csr > scheduler-csr.json
[root@vms71 xx]#
[root@vms71 xx]# cat scheduler-csr.json
{
  "CN": "system:kube-scheduler",
  "key": {
    "algo": "rsa",
    "size": 2048
  },
   "hosts": [
     "127.0.0.1",
     "192.168.26.71"
    ],
  "names": [
    {
      "C": "CN",
      "ST": "Jiangsu",
      "L": "Xuzhou",
      "O": "system:kube-scheduler",
      "OU": "system"
    }
  ]
}

[root@vms71 xx]#

kubernetes内置的ClusterRoleBindings system:kube-scheduler将授权kube-scheduler所需的权限。
生成证书。

[root@vms71 xx]# cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=www scheduler-csr.json | cfssljson -bare scheduler
[root@vms71 xx]#

8.kube-proxy

kube-proxy需要跟apiserver进行mTLS认证,生成证书申请请求文件。

[root@vms71 xx]# cfssl print-defaults csr > proxy-csr.json
[root@vms71 xx]# cat proxy-csr.json
{
  "CN": "system:kube-proxy",
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "CN",
      "ST": "Jiangsu",
      "L": "Xuzhou",
      "O": "kubernetes",
      "OU": "system"
    }
  ]
}
[root@vms71 xx]#

颁发证书。

[root@vms71 xx]# cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=www proxy-csr.json | cfssljson -bare proxy
    ...输出...
[root@vms71 xx]#

[root@vms71 xx]# ls -1 proxy*.pem
proxy-key.pem
proxy.pem
[root@vms71 xx]#

9.管理员admin能用的证书

管理员也要先登录才能执行kubectl命令,所以也需要kubeconfig文件。
先生成证书请求文件,并修改内容如下。

[root@vms71 xx]# cfssl print-defaults csr > admin-csr.json
[root@vms71 xx]# cat admin-csr.json
{
  "CN": "admin",
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "CN",
      "ST": "Jiangsu",
      "L": "Xuzhou",
      "O": "system:masters",
      "OU": "system"
    }
  ]
}
[root@vms71 xx]#

颁发证书。

[root@vms71 xx]# cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=www admin-csr.json | cfssljson -bare admin
    ...输出...
[root@vms71 xx]# 

[root@vms71 xx]# ls -1 admin*.pem
admin-key.pem
admin.pem
[root@vms71 xx]#

把以上生成出来的所有的证书(后缀为pem)都拷贝到/etc/kubernetes/pki里。

[root@vms71 xx]# cp *.pem /etc/kubernetes/pki/
[root@vms71 xx]# ls /etc/kubernetes/pki/
admin-key.pem          ca-key.pem             etcd-client-key.pem  front-proxy-ca-key.pem  proxy-key.pem         admin.pem       ca.pem               etcd-client.pem         front-proxy-ca.pem      proxy.pem
apiserver-key.pem  controller-manager-key.pem  etcd-key.pem         front-proxy-client-key.pem  scheduler-key.pem
apiserver.pem      controller-manager.pem      etcd.pem             front-proxy-client.pem      scheduler.pem
[root@vms71 xx]# cd
[root@vms71 ~]# 

3.配置和安装etcd

1.安装etcd创建etcd的启动文件

到如下链接下载最新版的etcd二进制文件。
https://github.com/etcd-io/etcd/releases/download/v3.5.4/etcd-v3.5.4-linux-amd64.tar.gz
之后解压并把可执行文件拷贝到/usr/local/bin目录下。

[root@vms71 ~]# tar zxf etcd-v3.5.4-linux-amd64.tar.gz 
[root@vms71 ~]#
[root@vms71 ~]# cp etcd-v3.5.4-linux-amd64/etcd* /usr/local/bin/
[root@vms71 ~]#

创建如下两个目录。

[root@vms71 ~]# mkdir /etc/etcd  /var/lib/etcd
[root@vms71 ~]#

注意,这个目录/var/lib/etcd一定要创建出来,否则etcd启动不了,会有
code=exited, status=200/CHDIR
报错信息。

创建etcd所需要配置文件 /etc/etcd/etcd.conf内容如下。

[root@vms71 ~]# cat /etc/etcd/etcd.conf
#[Member]
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_PEER_URLS="https://192.168.26.71:2380"
ETCD_LISTEN_CLIENT_URLS="https://192.168.26.71:2379,http://127.0.0.1:2379"
ETCD_NAME="etcd1"
#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="https://192.168.26.71:2380"
ETCD_ADVERTISE_CLIENT_URLS="https://192.168.26.71:2379"
ETCD_INITIAL_CLUSTER="etcd1=https://192.168.26.71:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"
[root@vms71 ~]# 

创建etcd的启动脚本,内容如下。

[root@vms71 ~]# cat /usr/lib/systemd/system/etcd.service
[Unit]
Description=Etcd Server
After=network.target
After=network-online.target
Wants=network-online.target

[Service]
Type=notify
EnvironmentFile=-/etc/etcd/etcd.conf
WorkingDirectory=/var/lib/etcd/
ExecStart=/usr/local/bin/etcd \
  --cert-file=/etc/kubernetes/pki/etcd.pem \
  --key-file=/etc/kubernetes/pki/etcd-key.pem \
  --trusted-ca-file=/etc/kubernetes/pki/ca.pem \
  --peer-cert-file=/etc/kubernetes/pki/etcd.pem \
  --peer-key-file=/etc/kubernetes/pki/etcd-key.pem \
  --peer-trusted-ca-file=/etc/kubernetes/pki/ca.pem \
  --peer-client-cert-auth \
  --client-cert-auth
Restart=on-failure
RestartSec=5
LimitNOFILE=65536

[Install]
WantedBy=multi-user.target
[root@vms71 ~]#

2.启动etcd

在vms71上启动etcd并设置开机自动启动。

[root@vms71 ~]# systemctl enable etcd --now
Created symlink from /etc/systemd/system/multi-user.target.wants/etcd.service...
[root@vms71 ~]#

[root@vms71 ~]# systemctl is-active etcd
active
[root@vms71 ~]#

4.配置kubernetes各个组件

下载kubernetes对应版本的二进制包,这里安装的是1.23.2版本的。
https://github.com/kubernetes/kubernetes/tree/master/CHANGELOG
下载之后先解压,并把对应的可执行命令拷贝到对应的目录

[root@vms71 ~]# tar zxf kubernetes-server-linux-amd64.tar.gz 
[root@vms71 ~]#
[root@vms71 ~]# cd kubernetes/server/bin/
[root@vms71 bin]# cp kube-apiserver kube-controller-manager kube-scheduler kubelet kubectl  kube-proxy  /usr/bin/
[root@vms71 bin]# scp kubelet kube-proxy 192.168.26.72:/usr/bin/
root@192.168.26.72's password:  
[root@vms71 bin]# cd
[root@vms71 ~]#

1.安装和配置apiserver

因为后面要配置kubelet的bootstrap认证,即kubelet启动时自动创建CSR请求,这里需要在apiserver上开启token的认证。所以先在master上生成一个随机值作为token。

[root@vms71 ~]# openssl rand -hex 10
6440328e1b3a1f4873dc
[root@vms71 ~]#

把这个token写入到一个文件里,这里写入到 /etc/kubernetes/bb.csv。

[root@vms71 ~]# cat /etc/kubernetes/bb.csv
6440328e1b3a1f4873dc,kubelet-bootstrap,10001,"system:node-bootstrapper"
[root@vms71 ~]# 

这里第二列定义了一个用户名kubelet-bootstrap,后面在配置kubelet时会为此用户授权。

1.创建apiserver的启动脚本

创建apiserver的启动脚本,路径和内容如下。

[root@vms71 ~]# cat /usr/lib/systemd/system/kube-apiserver.service
[Unit]
Description=Kubernetes API Server
Documentation=https://github.com/kubernetes/kubernetes
After=network.target

[Service]
ExecStart=/usr/bin/kube-apiserver \
      --v=2  \
      --logtostderr=true  \
      --allow-privileged=true  \
      --bind-address=192.168.26.71  \
      --secure-port=6443 \
      --token-auth-file=/etc/kubernetes/bb.csv  \
      --advertise-address=192.168.26.71 \
      --service-cluster-ip-range=10.96.0.0/16  \
      --service-node-port-range=30000-60000  \
      --etcd-servers=https://192.168.26.71:2379 \
      --etcd-cafile=/etc/kubernetes/pki/ca.pem  \
      --etcd-certfile=/etc/kubernetes/pki/etcd.pem  \
      --etcd-keyfile=/etc/kubernetes/pki/etcd-key.pem  \
      --client-ca-file=/etc/kubernetes/pki/ca.pem  \
      --tls-cert-file=/etc/kubernetes/pki/apiserver.pem  \
      --tls-private-key-file=/etc/kubernetes/pki/apiserver-key.pem  \
      --kubelet-client-certificate=/etc/kubernetes/pki/apiserver.pem  \
      --kubelet-client-key=/etc/kubernetes/pki/apiserver-key.pem  \
      --service-account-key-file=/etc/kubernetes/pki/ca-key.pem  \
      --service-account-signing-key-file=/etc/kubernetes/pki/ca-key.pem  \
      --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=/etc/kubernetes/pki/front-proxy-ca.pem  \
      #--proxy-client-cert-file=/etc/kubernetes/pki/front-proxy-client.pem  \
      #--proxy-client-key-file=/etc/kubernetes/pki/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  

Restart=on-failure
RestartSec=10s
LimitNOFILE=65535

[Install]
WantedBy=multi-user.target
[root@vms71 ~]#

上面注释的部分是配置聚合层的,本环境里没有启用聚合层所以这些选项被注释了,如果配置了聚合层的话,则需要把#取消。
几个选项作用如下。
--v:日志等级
--enable-bootstrap-token-auth:启用TLS bootstrap机制
--token-auth-file:bootstrap token文件

2.启动apiserver

[root@vms71 ~]# systemctl enable  kube-apiserver --now
Created symlink from /etc/systemd/system/multi-user.target.wants/kube-apiserver.service...
[root@vms71 ~]#

2.安装和配置controller-manager

1.创建controller-manager的启动服务

创建controller-manager的启动脚本,路径和内容如下。

[root@vms71 ~]# cat /usr/lib/systemd/system/kube-controller-manager.service
[Unit]
Description=Kubernetes Controller Manager
Documentation=https://github.com/kubernetes/kubernetes
After=network.target

[Service]
ExecStart=/usr/bin/kube-controller-manager \
      --v=2 \
      --logtostderr=true \
      --bind-address=127.0.0.1 \
      --root-ca-file=/etc/kubernetes/pki/ca.pem \
      --cluster-signing-cert-file=/etc/kubernetes/pki/ca.pem \
      --cluster-signing-key-file=/etc/kubernetes/pki/ca-key.pem \
      --service-account-private-key-file=/etc/kubernetes/pki/ca-key.pem \
      --kubeconfig=/etc/kubernetes/kube-controller-manager.kubeconfig \
      --leader-elect=true \
      --use-service-account-credentials=true \
      --node-monitor-grace-period=40s \
      --node-monitor-period=5s \
      --pod-eviction-timeout=2m0s \
      --controllers=*,bootstrapsigner,tokencleaner \
      --allocate-node-cidrs=true \
      --cluster-cidr=10.244.0.0/16 \
      --node-cidr-mask-size=24
Restart=always
RestartSec=10s

[Install]
WantedBy=multi-user.target
[root@vms71 ~]#

2.创建controller-manager所需要的kubeconfig文件

controller-manager和apiserver之间的认证是通过kubeconfig的方式来认证的,即controller-manager的私钥、公钥及CA的证书要放在一个kubeconfig文件里。下面创建controller-manager所用的kubeconfig文件kube-controller-manager.kubeconfig,现在在/etc/kubernetes/pki里创建,然后剪切到/etc/kubernetes里。

[root@vms71 ~]# cd /etc/kubernetes/pki/
[root@vms71 pki]#
#设置集群信息
[root@vms71 pki]# kubectl config set-cluster kubernetes --certificate-authority=ca.pem --embed-certs=true --server=https://192.168.26.71:6443 --kubeconfig=kube-controller-manager.kubeconfig
Cluster "kubernetes" set.
[root@vms71 pki]# 
#下条命令设置用户信息,这里用户名是system:kube-controller-manager ,也就是前面controller-manager-csr.json里CN指定的。
[root@vms71 pki]# kubectl config set-credentials system:kube-controller-manager --client-certificate=controller-manager.pem --client-key=controller-manager-key.pem --embed-certs=true --kubeconfig=kube-controller-manager.kubeconfig
User "system:kube-controller-manager" set.
[root@vms71 pki]#
#设置上下文信息。
[root@vms71 pki]# kubectl config set-context system:kube-controller-manager --cluster=kubernetes --user=system:kube-controller-manager --kubeconfig=kube-controller-manager.kubeconfig
Context "system:kube-controller-manager" created.
[root@vms71 pki]# 
#设置默认的上下文
[root@vms71 pki]# kubectl config use-context system:kube-controller-manager --kubeconfig=kube-controller-manager.kubeconfig
Switched to context "system:kube-controller-manager".
[root@vms71 pki]# 
[root@vms71 pki]# mv kube-controller-manager.kubeconfig /etc/kubernetes/
[root@vms71 pki]# cd
[root@vms71 ~]#

后面其他组件设置kubeconfig时意思相同,后面不再做解释。

3.启动controller-manager服务

启动controller-manager并设置开机自动启动

[root@vms71 ~]# systemctl daemon-reload 
[root@vms71 ~]# systemctl enable kube-controller-manager --now
Created symlink from /etc/systemd/system/multi-user.target.wants/kube-controller-manager.service ...
[root@vms71 ~]# systemctl is-active kube-controller-manager
active
[root@vms71 ~]#

3.安装和配置scheduler

1.创建kube-scheduler的启动服务

创建kube-scheduler的启动脚本,路径和内容如下。

[root@vms71 ~]# cat /usr/lib/systemd/system/kube-scheduler.service
[Unit]
Description=Kubernetes Scheduler
Documentation=https://github.com/kubernetes/kubernetes
After=network.target

[Service]
ExecStart=/usr/bin/kube-scheduler \
      --v=2 \
      --logtostderr=true \
      --bind-address=127.0.0.1 \
      --leader-elect=true \
      --kubeconfig=/etc/kubernetes/kube-scheduler.kubeconfig

Restart=always
RestartSec=10s

[Install]
WantedBy=multi-user.target
[root@vms71 ~]#

2.创建kube-scheduler所需要的kubeconfig文件

kube-scheduler和apiserver之间的认证是通过kubeconfig的方式来认证的,即kube-scheduler的私钥、公钥及CA的证书要放在一个kubeconfig文件里。下面创建kube-scheduler所用的kubeconfig文件kube-scheduler.kubeconfig,现在在/etc/kubernetes/pki里创建,然后剪切到/etc/kubernetes里。

[root@vms71 ~]# cd /etc/kubernetes/pki/
[root@vms71 pki]# 
[root@vms71 pki]# kubectl config set-cluster kubernetes --certificate-authority=ca.pem --embed-certs=true --server=https://192.168.26.71:6443 --kubeconfig=kube-scheduler.kubeconfig
Cluster "kubernetes" set.
[root@vms71 pki]# kubectl config set-credentials system:kube-scheduler --client-certificate=scheduler.pem --client-key=scheduler-key.pem --embed-certs=true --kubeconfig=kube-scheduler.kubeconfig
User "system:kube-scheduler" set.
[root@vms71 pki]# kubectl config set-context system:kube-scheduler --cluster=kubernetes --user=system:kube-scheduler --kubeconfig=kube-scheduler.kubeconfig
Context "system:kube-scheduler" created.
[root@vms71 pki]# kubectl config use-context system:kube-scheduler --kubeconfig=kube-scheduler.kubeconfig
Switched to context "system:kube-scheduler".
[root@vms71 pki]# 
[root@vms71 pki]# mv kube-scheduler.kubeconfig /etc/kubernetes/
[root@vms71 pki]# cd
[root@vms71 ~]#

这里的意思跟controller-manager里创建kubeconfig的意思一样,这里不再解释。

3.启动kube-scheduler服务

启动kube-scheduler 并设置开机自动启动

[root@vms71 ~]# systemctl enable kube-scheduler --now
Created symlink from /etc/systemd/system/multi-user.target.wants/kube-scheduler.service....
[root@vms71 ~]# systemctl is-active kube-scheduler
active
[root@vms71 ~]#

4.创建admin能用的kubeconfig文件

创建管理员用户用的kubeconfig,最后拷贝为~/.kube/config作为默认的kubeconfig文件。

[root@vms71 ~]# cd /etc/kubernetes/pki/
[root@vms71 pki]# 
[root@vms71 pki]# kubectl config set-cluster kubernetes --certificate-authority=ca.pem --embed-certs=true --server=https://192.168.26.71:6443 --kubeconfig=admin.conf
Cluster "kubernetes" set.
[root@vms71 pki]# kubectl config set-credentials admin --client-certificate=admin.pem --client-key=admin-key.pem --embed-certs=true --kubeconfig=admin.conf
User "admin" set.
[root@vms71 pki]# kubectl config set-context kubernetes --cluster=kubernetes --user=admin --kubeconfig=admin.conf
Context "kubernetes" created.
[root@vms71 pki]# kubectl config use-context kubernetes --kubeconfig=admin.conf
Switched to context "kubernetes".
[root@vms71 pki]# cp admin.conf /etc/kubernetes/
[root@vms71 pki]# mkdir  ~/.kube
[root@vms71 pki]# cp admin.conf ~/.kube/config
[root@vms71 pki]# cd
[root@vms71 ~]# 

5.kubelet

为用户kubelet-bootstrap授权,允许kubelet tls bootstrap创建CSR请求。

[root@vms71 ~]# kubectl create clusterrolebinding kubelet-bootstrap1 --clusterrole=system:node-bootstrapper --user=kubelet-bootstrap
clusterrolebinding.rbac.authorization.k8s.io/kubelet-bootstrap created
[root@vms71 ~]# 

把system:certificates.k8s.io:certificatesigningrequests:nodeclient授权给kubelet-bootstrap,目的是实现对CSR的自动审批。

[root@vms71 ~]# kubectl create clusterrolebinding kubelet-bootstrap2 --clusterrole=system:certificates.k8s.io:certificatesigningrequests:nodeclient --user=kubelet-bootstrap
clusterrolebinding.rbac.authorization.k8s.io/kubelet-bootstrap2 created
[root@vms71 ~]#

这个用户名是在配置apiserver时用到的token文件/etc/kubernetes/bb.csv里指定的。

[root@vms71 ~]# cat /etc/kubernetes/bb.csv 
6440328e1b3a1f4873dc,kubelet-bootstrap,10001,"system:kubelet-bootstrapper"
[root@vms71 ~]#

创建kubelet bootstap的kubeconfig文件。

[root@vms71 ~]# cd /etc/kubernetes/pki/
[root@vms71 pki]# 
[root@vms71 pki]# #kubelet-bootstrap.conf 
[root@vms71 pki]# kubectl config set-cluster kubernetes --certificate-authority=ca.pem --embed-certs=true --server=https://192.168.26.71:6443 --kubeconfig=kubelet-bootstrap.conf 
Cluster "kubernetes" set.
[root@vms71 pki]# kubectl config set-credentials kubelet-bootstrap --token=6440328e1b3a1f4873dc  --kubeconfig=kubelet-bootstrap.conf 
User "kubelet-bootstrap" set.
[root@vms71 pki]# kubectl config set-context kubernetes --cluster=kubernetes --user=kubelet-bootstrap --kubeconfig=kubelet-bootstrap.conf 
Context "kubernetes" created.
[root@vms71 pki]# kubectl config use-context kubernetes --kubeconfig=kubelet-bootstrap.conf 
Switched to context "kubernetes".
[root@vms71 pki]# 
[root@vms71 pki]# mv kubelet-bootstrap.conf  /etc/kubernetes/
[root@vms71 pki]# cd
[root@vms71 ~]#

1.创建启动脚本

我们后面将会把给kubelet颁发的证书放在/var/lib/kubelet/pki里,所以我们先把此目录创建出来。

[root@vms7X ~]# mkdir -p /var/lib/kubelet/pki /var/log/kubernetes

创建启动脚本,路径即内容如下。

[root@vms71 ~]# cat /usr/lib/systemd/system/kubelet.service
[Unit]
Description=Kubernetes Kubelet
Documentation=https://github.com/kubernetes/kubernetes
After=containerd.service
Requires=containerd.service

[Service]
WorkingDirectory=/var/lib/kubelet
ExecStart=/usr/bin/kubelet \
  --bootstrap-kubeconfig=/etc/kubernetes/kubelet-bootstrap.conf  \
  --cert-dir=/var/lib/kubelet/pki \
  --hostname-override=vms71.rhce.cc \
  --kubeconfig=/etc/kubernetes/kubelet.kubeconfig \
  --config=/etc/kubernetes/kubelet-config.yaml \
  --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.7 \
  --container-runtime=remote \
  --container-runtime-endpoint=unix:///var/run/containerd/containerd.sock \
  --runtime-request-timeout=15m \
  --alsologtostderr=true \
  --logtostderr=false \
  --log-dir=/var/log/kubernetes \
  --v=2
Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target
[root@vms71 ~]#

这里我们也指定了pause镜像的版本,所以在所有节点拉取pause镜像

[root@vms7X ~]# nerdctl pull registry.aliyuncs.com/google_containers/pause:3.7
    ...输出...
[root@vms7X ~]# 

2.创建kubelet用的配置文件

创建kubelet能用到的配置文件,这个文件的路径要和kubelet启动文件里指定的一致,内容如下。

[root@vms71 ~]# cat /etc/kubernetes/kubelet-config.yaml
apiVersion: kubelet.config.k8s.io/v1beta1
address: 0.0.0.0
port: 10250 
readOnlyPort: 10255
authentication:
  anonymous:
    enabled: false
  webhook:
    cacheTTL: 0s
    enabled: true
  x509:
    clientCAFile: /etc/kubernetes/pki/ca.pem
authorization:
  mode: Webhook
  webhook:
    cacheAuthorizedTTL: 0s
    cacheUnauthorizedTTL: 0s
cgroupDriver: systemd
clusterDNS:
- 10.96.0.10
clusterDomain: cluster.local
cpuManagerReconcilePeriod: 0s
evictionPressureTransitionPeriod: 0s
fileCheckFrequency: 0s
healthzBindAddress: 127.0.0.1
httpCheckFrequency: 0s
imageMinimumGCAge: 0s
kind: KubeletConfiguration
[root@vms71 ~]# 

这里我们指定clusterDNS的IP是10.96.0.10。

3.同步文件到其他工作节点

把kubelet能用到的文件同步到所有的worker上。
先到vms72创建目录。

[root@vms72 ~]# mkdir -p /etc/kubernetes/pki
[root@vms72 ~]#
#拷贝启动脚本
[root@vms71 ~]# scp /usr/lib/systemd/system/kubelet.service 192.168.26.72:/usr/lib/systemd/system/kubelet.service
root@192.168.26.72's password:
kubelet.service           100%  684   425.3KB/s   00:00
[root@vms71 ~]#
#拷贝ca证书
[root@vms71 ~]# scp /etc/kubernetes/pki/ca.pem 192.168.26.72:/etc/kubernetes/pki/
root@192.168.26.72's password:
ca.pem            100% 1375     1.1MB/s   00:00
[root@vms71 ~]#
#拷贝bootstrap kubeconfig和kubelet的参数文件
[root@vms71 ~]# scp /etc/kubernetes/kubelet-bootstrap.conf /etc/kubernetes/kubelet-config.yaml 192.168.26.72:/etc/kubernetes/
root@192.168.26.72's password:
kubelet-bootstrap.conf       100% 4091     1.3MB/s   00:00
kubelet-config.yaml          100%  555   277.3KB/s   00:00
[root@vms71 ~]#

在vms72修改启动脚本里参数hostname-override的值,确保和自己主机名一致。

[root@vms72 ~]# sed  -i 's/vms71/vms72/' /usr/lib/systemd/system/kubelet.service

4.启动kubelet

启动kubelet并设置开机自动启动。

[root@vms7X ~]# systemctl daemon-reload
[root@vms7X ~]# systemctl enable kubelet --now
Created symlink from /etc/systemd/system/multi-user.target.wants/kubelet.service ...
[root@vms7X ~]# 

切换到master(vms71)上查看证书申请请求。

[root@vms71 ~]# kubectl get csr
NAME         AGE     SIGNERNAME                                    REQUESTOR           REQUESTEDDURATION   CONDITION
node-csr-xx   4m52s   kubernetes.io/kube-apiserver-client-kubelet   kubelet-bootstrap   <none>              Approved,Issued
node-csr-yy   3m37s   kubernetes.io/kube-apiserver-client-kubelet   kubelet-bootstrap   <none>              Approved,Issued
[root@vms71 ~]# 

这里节点都自动审批了,并非手动审批证书。
查看节点状态

[root@vms71 ~]# kubectl get nodes
NAME            STATUS     ROLES    AGE     VERSION
vms71.rhce.cc   NotReady   <none>   4m57s   v1.24.1
vms72.rhce.cc   NotReady   <none>   3m42s   v1.24.1
[root@vms71 ~]# 

因为CSR自动批准,所以可以看到节点已经加过来。

6.安装kube-proxy

1.创建kube-proxy所需的kubeconfig文件

[root@vms71 ~]# cd /etc/kubernetes/pki/
[root@vms71 pki]#
[root@vms71 pki]# kubectl config set-cluster kubernetes --certificate-authority=ca.pem --embed-certs=true --server=https://192.168.26.71:6443 --kubeconfig=kube-proxy.kubeconfig
Cluster "kubernetes" set.
[root@vms71 pki]# kubectl config set-credentials kube-proxy --client-certificate=proxy.pem --client-key=proxy-key.pem --embed-certs=true --kubeconfig=kube-proxy.kubeconfig
User "kube-proxy" set.
[root@vms71 pki]# kubectl config set-context default --cluster=kubernetes --user=kube-proxy --kubeconfig=kube-proxy.kubeconfig
Context "default" created.
[root@vms71 pki]# kubectl config use-context default --kubeconfig=kube-proxy.kubeconfig
Switched to context "default".
[root@vms71 pki]# 
[root@vms71 pki]# mv kube-proxy.kubeconfig /etc/kubernetes/
[root@vms71 pki]# cd
[root@vms71 ~]#

2.创建kube-proxy配置文件

[root@vms71 ~]# cat /etc/kubernetes/kube-proxy.yaml
apiVersion: kubeproxy.config.k8s.io/v1alpha1
bindAddress: 0.0.0.0
clientConnection:
  kubeconfig: /etc/kubernetes/kube-proxy.kubeconfig
clusterCIDR: 10.244.0.0/16 
kind: KubeProxyConfiguration
metricsBindAddress: 0.0.0.0:10249
mode: "ipvs"
[root@vms71 ~]#

3.创建启动文件

[root@vms71 ~]# cat /usr/lib/systemd/system/kube-proxy.service
[Unit]
Description=Kubernetes Kube-Proxy Server
Documentation=https://github.com/kubernetes/kubernetes
After=network.target

[Service]
WorkingDirectory=/var/lib/kube-proxy
ExecStart=/usr/bin/kube-proxy \
  --config=/etc/kubernetes/kube-proxy.yaml \
  --alsologtostderr=true \
  --logtostderr=false \
  --log-dir=/var/log/kubernetes \
  --v=2
Restart=on-failure
RestartSec=5
LimitNOFILE=65536

[Install]
WantedBy=multi-user.target
[root@vms71 ~]# 

4.同步配置文件

[root@vms71 ~]# scp /etc/kubernetes/{kube-proxy.yaml,kube-proxy.kubeconfig} 192.168.26.72:/etc/kubernetes/
root@192.168.26.72's password: 
kube-proxy.yaml                 100%  240   221.3KB/s   00:00
kube-proxy.kubeconfig            100%  240   221.3KB/s   00:00      
[root@vms71 ~]# scp /usr/lib/systemd/system/kube-proxy.service 192.168.26.72:/usr/lib/systemd/system/
root@192.168.26.72's password: 
kube-proxy.service                                                                             100%  430   308.8KB/s   00:00    
[root@vms71 ~]#

5.启动kube-proxy

在各个节点上创建目录

[root@vms7X ~]# mkdir -p /var/lib/kube-proxy
[root@vms7X ~]# systemctl daemon-reload 
[root@vms7X ~]# systemctl enable kube-proxy --now
Created symlink from /etc/systemd/system/multi-user.target.wants/kube-proxy.service...
[root@vms7X ~]#
[root@vms7X ~]# systemctl is-active kube-proxy.service 
active
[root@vms7X ~]#

7.创建必要的权限

1.编写rbac.yaml

[root@vms71 ~]# cat rbac.yaml 
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  annotations:
    rbac.authorization.kubernetes.io/autoupdate: "true"
  labels:
    kubernetes.io/bootstrapping: rbac-defaults
  name: system:kubernetes-to-kubelet
rules:
  - apiGroups:
      - ""
    resources:
      - nodes/proxy
      - nodes/stats
      - nodes/log
      - nodes/spec
      - nodes/metrics
    verbs:
      - "*"
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: system:kubernetes
  namespace: ""
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: system:kubernetes-to-kubelet
subjects:
  - apiGroup: rbac.authorization.k8s.io
    kind: User
    name: kubernetes
[root@vms71 ~]#

2.创建角色及授权

创建角色并授权

[root@vms71 ~]# kubectl apply -f rbac.yaml 
clusterrole.rbac.authorization.k8s.io/system:kubernetes-to-kubelet created
clusterrolebinding.rbac.authorization.k8s.io/system:kubernetes created
[root@vms71 ~]#

5.安装calico

在master上,通过如下命令
wget https://docs.projectcalico.org/manifests/calico.yaml
修改calico.yaml文件,改如下两处。
1.搜索CALICO_IPV4POOL_CIDR
file
2.搜索IP_AUTODETECTION_METHOD,把interface设置为自己的网卡。
file
开始安装calico。

[root@vms71 ~]# kubectl apply -fcalico.yaml
[root@vms71 ~]# kubectl get nodes
NAME            STATUS   ROLES    AGE   VERSION
vms71.rhce.cc   Ready    <none>   26m   v1.24.1
vms72.rhce.cc   Ready    <none>   25m   v1.24.1
[root@vms71 ~]# 
[root@vms71 ~]#  kubectl get pods -n kube-system
NAME                                       READY   STATUS    RESTARTS   AGE
calico-kube-controllers-56cdb7c587-8sv9s   1/1     Running   0          21s
calico-node-9vj4h                          1/1     Running   0          21s
calico-node-m52tl                          1/1     Running   0          21s
[root@vms71 ~]#

6.部署coreDNS

1.下载并修改manifest文件

下载并修改coreDNS的manifest文件。
https://github.com/coredns/deployment/blob/master/kubernetes/coredns.yaml.sed
复制如下yaml
https://raw.githubusercontent.com/coredns/deployment/master/kubernetes/coredns.yaml.sed
1.搜索apra,大概62行
file
改为cluster.local in-addr.arpa ip6.arpa
file
file
file

2.安装coreDNS

[root@vms71 ~]# kubectl apply -f coredns.yaml 
serviceaccount/coredns created
clusterrole.rbac.authorization.k8s.io/system:coredns created
clusterrolebinding.rbac.authorization.k8s.io/system:coredns created
configmap/coredns created
deployment.apps/coredns created
service/kube-dns created
[root@vms71 ~]# 

[root@vms71 ~]#  kubectl get pods -n kube-system
NAME                                       READY   STATUS    RESTARTS   AGE
calico-kube-controllers-56cdb7c587-8sv9s   1/1     Running   0          5m47s
calico-node-9vj4h                          1/1     Running   0          5m47s
calico-node-m52tl                          1/1     Running   0          5m47s
coredns-6cd56d4df4-5sqsm                   1/1     Running   0          3s
[root@vms71 ~]#

查看coreDNS对应svc的IP。

[root@vms71 ~]# kubectl get svc -n kube-system
NAME       TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)                  AGE
kube-dns   ClusterIP   10.96.0.10   <none>        53/UDP,53/TCP,9153/TCP   44s
[root@vms71 ~]#

7.测试

[root@vms71 ~]# kubectl run pod1 --image=nginx --image-pull-policy=IfNotPresent --dry-run=client -o yaml > pod1.yaml
[root@vms71 ~]# kubectl apply -f pod1.yaml 
pod/pod1 created
[root@vms71 ~]# sed 's/pod1/pod2/' pod1.yaml | kubectl apply -f -
pod/pod2 created
[root@vms71 ~]# kubectl get pods
NAME   READY   STATUS    RESTARTS   AGE
pod1   1/1     Running   0          29s
pod2   1/1     Running   0          5s
[root@vms71 ~]#
[root@vms71 ~]# kubectl expose --name=svc1 pod pod1 --port=80
service/svc1 exposed
[root@vms71 ~]#

[root@vms71 ~]# kubectl exec -it pod1 -- sh -c "echo 111 > /usr/share/nginx/html/index.html"
[root@vms71 ~]#

[root@vms71 ~]# kubectl exec -it pod2 -- bash
root@pod2:/# curl svc1
111
root@pod2:/# exit
exit
[root@vms71 ~]#

相关新闻

发表回复

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据

                                                                                                                                    RHCE9学习指南连载,点击阅读