十二、Kubernetes_v1.14.2 kube-apiserverクラスタの配備

11559 ワード

一、ダウンロードして解凍する
#  
wget https://dl.k8s.io/v1.14.2/kubernetes-server-linux-amd64.tar.gz
#  
tar -zxvf kubernetes-server-linux-amd64.tar.gz -C /opt/kubernetes/package/
#        
ls /opt/kubernetes/package/kubernetes/server/bin/

 
 
二、kube-apiserverファイルの配布
source /root/env.sh
for master_ip in ${MASTER_IPS[@]}
do
echo -e "\033[31m>>> ${master_ip} \033[0m"
scp /opt/kubernetes/package/kubernetes/server/bin/kube-apiserver root@${master_ip}:/opt/kubernetes/bin/
done
#        
source /root/env.sh
for master_ip in ${MASTER_IPS[@]}
do
echo -e "\033[31m>>> ${master_ip} \033[0m"
ssh root@${master_ip} "ls -ld /opt/kubernetes/bin/kube-apiserver"
done

 
 
三、APIサーバーの認証ファイルを作成する
cd /opt/kubernetes/ssl
cat > kubernetes-csr.json << EOF
{
  "CN": "kubernetes",
  "hosts": [
    "127.0.0.1",
    "172.27.128.200",
    "10.1.0.1",
    "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": "k8s",
      "OU": "System"
    }
  ]
}
EOF

 
 
四、Kubernetesの証明書と秘密鍵を生成する
cfssl gencert -ca=/opt/kubernetes/ssl/ca.pem \
   -ca-key=/opt/kubernetes/ssl/ca-key.pem \
   -config=/opt/kubernetes/ssl/ca-config.json \
   -profile=kubernetes kubernetes-csr.json | cfssljson -bare kubernetes

 
#        
ls -ld kubernetes-key.pem kubernetes.pem

 
 
五、生成された証明書と秘密鍵を配布する
source /root/env.sh
for master_ip in ${MASTER_IPS[@]}
do
echo -e "\033[31m>>> ${master_ip} \033[0m"
scp kubernetes-key.pem kubernetes.pem root@${master_ip}:/opt/kubernetes/ssl
done
#        
source /root/env.sh
for master_ip in ${MASTER_IPS[@]}
do
echo -e "\033[31m>>> ${master_ip} \033[0m"
ssh root@${master_ip} "ls -ld /opt/kubernetes/ssl/{kubernetes-key.pem,kubernetes.pem}"
done

 
 
六、APIサーバーで使用するtokenファイルを作成する
head -c 16 /dev/urandom | od -An -t x | tr -d ' '

#    :416569d477d651706738c3b6b8e2023e
cat > /opt/kubernetes/ssl/bootstrap-token.csv << EOF
416569d477d651706738c3b6b8e2023e,kubelet-bootstrap,10001,"system:kubelet-bootstrap"
EOF

 
 
七、API Serverが使用するtokenファイルの配布
source /root/env.sh
for master_ip in ${MASTER_IPS[@]}
do
echo -e "\033[31m>>> ${master_ip} \033[0m"
scp /opt/kubernetes/ssl/bootstrap-token.csv root@${master_ip}:/opt/kubernetes/ssl/
done
#        
source /root/env.sh
for master_ip in ${MASTER_IPS[@]}
do
echo -e "\033[31m>>> ${master_ip} \033[0m"
ssh root@${master_ip} "cat /opt/kubernetes/ssl/bootstrap-token.csv"
done

 
 
八、基礎ユーザー名、パスワード認証構成の作成
cat > /opt/kubernetes/ssl/basic-auth.csv << EOF
admin,admin,1
readonly,readonly,2
EOF

 
 
九、作成ベースユーザー名、パスワード認証プロファイルの配布
source /root/env.sh
for master_ip in ${MASTER_IPS[@]}
do
echo -e "\033[31m>>> ${master_ip} \033[0m"
scp /opt/kubernetes/ssl/basic-auth.csv root@${master_ip}:/opt/kubernetes/ssl/
done
#        
source /root/env.sh
for master_ip in ${MASTER_IPS[@]}
do
echo -e "\033[31m>>> ${master_ip} \033[0m"
ssh root@${master_ip} "cat /opt/kubernetes/ssl/basic-auth.csv"
done

 
 
十、metrics-server証明書の作成(metrics-serverプラグイン使用)
cd /opt/kubernetes/ssl

#  metrics-server-csr.json
cat > metrics-server-csr.json << EOF
{
  "CN": "aggregator",
  "hosts": [],
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "CN",
      "ST": "BeiJing",
      "L": "BeiJing",
      "O": "k8s",
      "OU": "System"
    }
  ]
}
EOF

 
 
十一、metrics-server証明書を生成する
cfssl gencert -ca=/opt/kubernetes/ssl/ca.pem \
-ca-key=/opt/kubernetes/ssl/ca-key.pem \
-config=/opt/kubernetes/ssl/ca-config.json \
-profile=kubernetes metrics-server-csr.json | cfssljson -bare metrics-server
#        
ls -ld metrics-server*.pem

 
 
十二、metrics-server証明書の配布
source /root/env.sh
for master_ip in ${MASTER_IPS[@]}
do
echo -e "\033[31m>>> ${master_ip} \033[0m"
scp metrics-server*.pem root@${master_ip}:/opt/kubernetes/ssl
done
#        
source /root/env.sh
for master_ip in ${MASTER_IPS[@]}
do
echo -e "\033[31m>>> ${master_ip} \033[0m"
ssh root@${master_ip} "ls -ld /opt/kubernetes/ssl/metrics-server*.pem"
done

 
 
十三、kube-apiserverの配備
#kube-apiserverのsystemdファイルの作成
source /root/env.sh
cat > kube-apiserver.service << EOF
[Unit]
Description=Kubernetes API Server
Documentation=https://github.com/GoogleCloudPlatform/kubernetes
After=network.target

[Service]
ExecStart=/opt/kubernetes/bin/kube-apiserver \\
  --enable-admission-plugins=MutatingAdmissionWebhook,ValidatingAdmissionWebhook,NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,ResourceQuota,NodeRestriction \\
  --bind-address=##MASTER_IP## \\
  --insecure-bind-address=127.0.0.1 \\
  --authorization-mode=Node,RBAC \\
  --runtime-config=api/all=true \\
  --kubelet-https=true \\
  --anonymous-auth=false \\
  --basic-auth-file=/opt/kubernetes/ssl/basic-auth.csv \\
  --enable-bootstrap-token-auth \\
  --token-auth-file=/opt/kubernetes/ssl/bootstrap-token.csv \\
  --service-cluster-ip-range=10.1.0.0/16 \\
  --service-node-port-range=20000-40000 \\
  --tls-cert-file=/opt/kubernetes/ssl/kubernetes.pem \\
  --tls-private-key-file=/opt/kubernetes/ssl/kubernetes-key.pem \\
  --client-ca-file=/opt/kubernetes/ssl/ca.pem \\
  --service-account-key-file=/opt/kubernetes/ssl/ca-key.pem \\
  --etcd-cafile=/opt/kubernetes/ssl/ca.pem \\
  --etcd-certfile=/opt/kubernetes/ssl/kubernetes.pem \\
  --etcd-keyfile=/opt/kubernetes/ssl/kubernetes-key.pem \\
  --etcd-servers=${ETCD_ENDPOINTS} \\
  --requestheader-client-ca-file=/opt/kubernetes/ssl/ca.pem \\
  --requestheader-extra-headers-prefix=X-Remote-Extra- \\
  --requestheader-group-headers=X-Remote-Group \\
  --requestheader-username-headers=X-Remote-User \\
  --proxy-client-cert-file=/opt/kubernetes/ssl/metrics-server.pem \\
  --proxy-client-key-file=/opt/kubernetes/ssl/metrics-server-key.pem \\
  --enable-swagger-ui=true \\
  --allow-privileged=true \\
  --audit-log-maxage=30 \\
  --audit-log-maxbackup=3 \\
  --audit-log-maxsize=100 \\
  --audit-log-path=/opt/kubernetes/log/api-audit.log \\
  --event-ttl=1h \\
  --v=2 \\
  --logtostderr=false \\
  --log-dir=/opt/kubernetes/log
Restart=on-failure
RestartSec=5
Type=notify
LimitNOFILE=65536

[Install]
WantedBy=multi-user.target
EOF
  • --etcd-*:etcdにアクセスする証明書とetcdサーバアドレス;
  • --enable-bootstrap-token-auth:kubelet bootstrapのtoken認証を有効にします.
  • --proxy-client-*:apiserverはmetrics-serverが使用する証明書にアクセスします.
  • --bind-address:httpsが傍受するIPは、127.0.0.1ではありません.そうしないと、外部からセキュリティポート6443にアクセスできません.
  • --authorization-mode=Node,RBAC--anonymous-auth=false:NodeとRBAC授権モードをオンにし、未授権の要求を拒否する.
  • --runtime-config=api/all=true:autoscaling/v 2 alpha 1などのすべてのバージョンのAPIsを有効にします.
  • --service-cluster-ip-range:Service Cluster IPアドレスセグメントを指定します.
  • --service-node-port-range:NodePortのポート範囲を指定します.

  •  
    14テンプレートファイルの変数を置き換え、各ノードにsystemd unitファイルを生成する
    source /root/env.sh
    for (( i=0; i < 3; i++ ))
    do
    sed -e "s/##MASTER_IP##/${MASTER_IPS[i]}/" kube-apiserver.service > kube-apiserver-${MASTER_IPS[i]}.service
    done
    #        
    ls kube-apiserver*.service

     
     
    十五、kube-apiserverのsystemdファイルを配布する
    source /root/env.sh
    for master_ip in ${MASTER_IPS[@]}
    do
    echo -e "\033[31m>>> ${master_ip} \033[0m"
    scp kube-apiserver-${master_ip}.service root@${master_ip}:/usr/lib/systemd/system/kube-apiserver.service
    done
    #        
    source /root/env.sh
    for master_ip in ${MASTER_IPS[@]}
    do
    echo -e "\033[31m>>> ${master_ip} \033[0m"
    ssh root@${master_ip} "ls -ld /usr/lib/systemd/system/kube-apiserver.service"
    done

     
     
    十六、kube-apiserverサービスを起動
    source /root/env.sh
    for master_ip in ${MASTER_IPS[@]}
    do
    echo -e "\033[31m>>> ${master_ip} \033[0m"
    ssh root@${master_ip} "systemctl daemon-reload && systemctl restart kube-apiserver && systemctl enable kube-apiserver"
    done

     
    十七、kube-apiserverサービスの検証
    source /root/env.sh
    for master_ip in ${MASTER_IPS[@]}
    do
    echo -e "\033[31m>>> ${master_ip} \033[0m"
    ssh root@${master_ip} "systemctl status kube-apiserver | grep Active"
    done

    ステータスがactive (running)であることを確認します.そうしないと、ログを表示し、原因を確認します.
    journalctl -u kube-apiserver

     
     
    18,kube-apiserverがetcdに書き込むデータを印刷する
    ETCDCTL_API=3 etcdctl \
    --endpoints=${ETCD_ENDPOINTS} \
    --cacert=/opt/kubernetes/ssl/ca.pem \
    --cert=/opt/kubernetes/ssl/etcd.pem \
    --key=/opt/kubernetes/ssl/etcd-key.pem \
    get /registry/ --prefix --keys-only

     
     
    十九、クラスタ情報を検査する
    kubectl cluster-info

    出力:Kubernetes master is running athttps://172.27.128.200:6443
    To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
     
    kubectl get all --all-namespaces

    出力:NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S)AGE default service/kubernetes ClusterIP 10.1.0.1 443/TCP 9 m 40 s
     
    kubectl get componentstatuses

    出力:NAME STATUS MESSAGE ERRORcontroller-manager Unhealthy Gethttp://127.0.0.1:10252/healthz: dial tcp 127.0.0.1:10252: connect: connection refused    scheduler                  Unhealthy   Get http://127.0.0.1:10251/healthz: dial tcp 127.0.0.1:10251: connect: connection refused    etcd-1               Healthy     {"health":"true"}                                                                            etcd-2               Healthy     {"health":"true"}                                                                            etcd-0               Healthy     {"health":"true"} 
     
     
    20、kube-apiserverが傍受しているポートを確認します.
    source /root/env.sh
    for master_ip in ${MASTER_IPS[@]}
    do
    echo -e "\033[31m>>> ${master_ip} \033[0m"
    ssh root@${master_ip} "netstat -lnpt | grep kube"
    done