kubernetes集群安裝指南:kube-apiserver組件部署

在kubernetes組件中,master節(jié)點組件主要包括:kube-apiserver,kube-controller-manager,kube-scheduler等三個組件,每個組件功能職責分工不同,這里我們將三個組件部署在同一機器上,分別部署了三臺機器。

西藏ssl適用于網(wǎng)站、小程序/APP、API接口等需要進行數(shù)據(jù)傳輸應(yīng)用場景,ssl證書未來市場廣闊!成為創(chuàng)新互聯(lián)公司的ssl證書銷售渠道,可以享受市場價格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:18980820575(備注:SSL證書合作)期待與您的合作!

1 安裝準備

1.1 環(huán)境變量定義
#################### Variable parameter setting ######################
KUBE_NAME=kube-apiserver
K8S_INSTALL_PATH=/data/apps/k8s/kubernetes
K8S_BIN_PATH=${K8S_INSTALL_PATH}/sbin
K8S_LOG_DIR=${K8S_INSTALL_PATH}/logs
K8S_CONF_PATH=/etc/k8s/kubernetes
CA_DIR=/etc/k8s/ssl
SOFTWARE=/root/software
VERSION=v1.14.2
PACKAGE="kubernetes-server-${VERSION}-linux-amd64.tar.gz"
DOWNLOAD_URL=“”https://github.com/devops-apps/download/raw/master/kubernetes/${PACKAGE}"
ETCD_ENDPOIDS=https://10.10.10.22:2379,https://10.10.10.23:2379,https://10.10.10.24:2379
ETH_INTERFACE=eth2
LISTEN_IP=$(ifconfig | grep -A 1 ${ETH_INTERFACE} |grep inet |awk '{print $2}')
USER=k8s
SERVICE_CIDR=10.254.0.0/22
NODE_PORT_RANG=8400-9400
1.2 下載和分發(fā) kubernetes 二進制文件

登陸devops機器,訪問kubernetes github 官方地址下載穩(wěn)定的 realease 包至本機;

wget  $DOWNLOAD_URL -P $SOFTWARE

將kubernetes 軟件包分發(fā)到各個master節(jié)點服務(wù)器;

sudo ansible master_k8s_vgs -m copy -a "src=${SOFTWARE}/$PACKAGE dest=${SOFTWARE}/" -b

2 安裝kube-apiserver組件服務(wù)

2.1 安裝kube-apiserver二進制文件
### 1.Check if the install directory exists.
if [ ! -d "$K8S_BIN_PATH" ]; then
     mkdir -p $K8S_BIN_PATH
fi

if [ ! -d "$K8S_LOG_DIR/$KUBE_NAME" ]; then
     mkdir -p $K8S_LOG_DIR/$KUBE_NAME
fi

if [ ! -d "$K8S_CONF_PATH" ]; then
     mkdir -p $K8S_CONF_PATH
fi

### 2.Install kube-apiserver binary of kubernetes.
if [ ! -f "$SOFTWARE/kubernetes-server-${VERSION}-linux-amd64.tar.gz" ]; then
     wget $DOWNLOAD_URL -P $SOFTWARE >>/tmp/install.log  2>&1
fi
cd $SOFTWARE && tar -xzf kubernetes-server-${VERSION}-linux-amd64.tar.gz -C ./
cp -fp kubernetes/server/bin/$KUBE_NAME $K8S_BIN_PATH
ln -sf  $K8S_BIN_PATH/$KUBE_NAM /usr/local/bin
chown -R $USER:$USER $K8S_INSTALL_PATH
chmod -R 755 $K8S_INSTALL_PATH
2.3 分發(fā) kubeconfig 文件和證書
分發(fā)證書
cd ${CA_DIR}
sudo ansible master_k8s_vgs -m  copy -a "src=ca.pem dest=${CA_DIR}/" -b
sudo ansible master_k8s_vgs -m  copy -a "src=ca-key.pem dest=${CA_DIR}/" -b
sudo ansible master_k8s_vgs -m  copy -a "src=kubernetes.pem dest=${CA_DIR}/" -b
sudo ansible master_k8s_vgs -m  copy -a  "src=kubernetes-key.pem dest=${CA_DIR}/" -b
sudo ansible master_k8s_vgs -m  copy -a  "src=proxy-clinet.pem dest=${CA_DIR}/" -b、
sudo ansible master_k8s_vgs -m  copy -a  "src=proxy-client-key.pem dest=${CA_DIR}/" -b
  • 因為master節(jié)點相關(guān)組件都部署在同一臺節(jié)點上,所有這里把ca根證書公鑰和私鑰都同步到每個master節(jié)點主機上;
  • proxy-client主要用于apiserver收集metric server資源使用;
2.4 創(chuàng)建審計策略文件
cat>${K8S_CONF_PATH}/audit-policy.yaml<<EOF
apiVersion: audit.k8s.io/v1beta1
kind: Policy
rules:
  # The following requests were manually identified as high-volume and low-risk, so drop them.
  - level: None
    resources:
      - group: ""
        resources:
          - endpoints
          - services
          - services/status
    users:
      - 'system:kube-proxy'
    verbs:
      - watch
  - level: None
    resources:
      - group: ""
        resources:
          - nodes
          - nodes/status
    userGroups:
      - 'system:nodes'
    verbs:
      - get
  - level: None
    namespaces:
      - kube-system
    resources:
      - group: ""
        resources:
          - endpoints
    users:
      - 'system:kube-controller-manager'
      - 'system:kube-scheduler'
      - 'system:serviceaccount:kube-system:endpoint-controller'
    verbs:
      - get
      - update
  - level: None
    resources:
      - group: ""
        resources:
          - namespaces
          - namespaces/status
          - namespaces/finalize
    users:
      - 'system:apiserver'
    verbs:
      - get
  # Don't log HPA fetching metrics.
  - level: None
    resources:
      - group: metrics.k8s.io
    users:
      - 'system:kube-controller-manager'
    verbs:
      - get
      - list
  # Don't log these read-only URLs.
  - level: None
    nonResourceURLs:
      - '/healthz*'
      - /version
      - '/swagger*'
  # Don't log events requests.
  - level: None
    resources:
      - group: ""
        resources:
          - events
  # node and pod status calls from nodes are high-volume and can be large
  - level: Request
    omitStages:
      - RequestReceived
    resources:
      - group: ""
        resources:
          - nodes/status
          - pods/status
    users:
      - kubelet
      - 'system:node-problem-detector'
      - 'system:serviceaccount:kube-system:node-problem-detector'
    verbs:
      - update
      - patch
  - level: Request
    omitStages:
      - RequestReceived
    resources:
      - group: ""
        resources:
          - nodes/status
          - pods/status
    userGroups:
      - 'system:nodes'
    verbs:
      - update
      - patch
  # deletecollection calls can be large, don't log responses for expected namespace deletions
  - level: Request
    omitStages:
      - RequestReceived
    users:
      - 'system:serviceaccount:kube-system:namespace-controller'
    verbs:
      - deletecollection
  # Secrets, ConfigMaps, and TokenReviews can contain sensitive & binary data,
  # so only log at the Metadata level.
  - level: Metadata
    omitStages:
      - RequestReceived
    resources:
      - group: ""
        resources:
          - secrets
          - configmaps
      - group: authentication.k8s.io
        resources:
          - tokenreviews
  # Get repsonses can be large; skip them.
  - level: Request
    omitStages:
      - RequestReceived
    resources:
      - group: ""
      - group: admissionregistration.k8s.io
      - group: apiextensions.k8s.io
      - group: apiregistration.k8s.io
      - group: apps
      - group: authentication.k8s.io
      - group: authorization.k8s.io
      - group: autoscaling
      - group: batch
      - group: certificates.k8s.io
      - group: extensions
      - group: metrics.k8s.io
      - group: networking.k8s.io
      - group: policy
      - group: rbac.authorization.k8s.io
      - group: scheduling.k8s.io
      - group: settings.k8s.io
      - group: storage.k8s.io
    verbs:
      - get
      - list
      - watch
  # Default level for known APIs
  - level: RequestResponse
    omitStages:
      - RequestReceived
    resources:
      - group: ""
      - group: admissionregistration.k8s.io
      - group: apiextensions.k8s.io
      - group: apiregistration.k8s.io
      - group: apps
      - group: authentication.k8s.io
      - group: authorization.k8s.io
      - group: autoscaling
      - group: batch
      - group: certificates.k8s.io
      - group: extensions
      - group: metrics.k8s.io
      - group: networking.k8s.io
      - group: policy
      - group: rbac.authorization.k8s.io
      - group: scheduling.k8s.io
      - group: settings.k8s.io
      - group: storage.k8s.io
  # Default level for all other requests.
  - level: Metadata
    omitStages:
      - RequestReceived
EOF
2.5 創(chuàng)建kube-apiserver 啟動服務(wù)
at >/usr/lib/systemd/system/${KUBE_NAME}.service<<EOF
[Unit]
Description=Kubernetes API Server
Documentation=https://github.com/GoogleCloudPlatform/kubernetes
After=network.target
[Service]
User=${USER}
Type=notify
WorkingDirectory=${K8S_INSTALL_PATH}
EnvironmentFile=-${K8S_CONF_PATH}/${KUBE_NAME}
ExecStart=${K8S_BIN_PATH}/${KUBE_NAME} \\
  --enable-admission-plugins=NodeRestriction \\
  --bind-address=0.0.0.0 \\
  --insecure-bind-address=${LISTEN_IP} \\
  --insecure-port=8080 \\
  --secure-port=6443 \\
  --advertise-address=${LISTEN_IP} \\
  --authorization-mode=Node,RBAC \\
  --anonymous-auth=false \\
  --runtime-config=api/all \\
  --enable-bootstrap-token-auth=true \\
  --token-auth-file=${K8S_CONF_PATH}/token.csv \\
  --service-cluster-ip-range=${SERVICE_CIDR} \\
  --service-node-port-range=${NODE_PORT_RANG} \\
  --requestheader-allowed-names="" \\
  --requestheader-client-ca-file=${CA_DIR}/ca.pem \\
  --requestheader-extra-headers-prefix="X-Remote-Extra-" \\
  --requestheader-group-headers=X-Remote-Group \\
  --requestheader-username-headers=X-Remote-User \\
  --tls-cert-file=${CA_DIR}/kubernetes.pem \\
  --tls-private-key-file=${CA_DIR}/kubernetes-key.pem \\
  --client-ca-file=${CA_DIR}/ca.pem \\
  --service-account-key-file=${CA_DIR}/ca.pem \\
  --etcd-cafile=${CA_DIR}/ca.pem \\
  --etcd-certfile=${CA_DIR}/etcd.pem \\
  --etcd-keyfile=${CA_DIR}/etcd-key.pem \\
  --etcd-servers=${ETCD_ENDPOIDS} \\
  --delete-collection-workers=2 \\
  --default-watch-cache-size=200 \\
  --kubelet-certificate-authority=${CA_DIR}/ca.pem \\
  --kubelet-client-certificate=${CA_DIR}/kubernetes.pem \\
  --kubelet-client-key=${CA_DIR}/kubernetes-key.pem \\
  --kubelet-https=true \\
  --kubelet-timeout=10s \\
  --proxy-client-cert-file=${CA_DIR}/proxy-client.pem \\
  --proxy-client-key-file=${CA_DIR}/proxy-client-key.pem \\
  --enable-aggregator-routing=true \\
  --enable-swagger-ui=true \\
  --allow-privileged=true \\
  --apiserver-count=3 \\
  --audit-log-mode=batch \\
  --audit-log-truncate-enabled=true \\
  --audit-log-batch-buffer-size=20000 \\
  --audit-log-batch-max-size=3 \\
  --audit-log-maxage=15 \\
  --audit-log-maxbackup=3 \\
  --audit-log-maxsize=100 \\
  --audit-log-path=${K8S_LOG_DIR}/${KUBE_NAME}/audit.log \\
  --audit-policy-file=${K8S_CONF_PATH}/audit-policy.yaml \\
  --storage-backend=etcd3 \\
  --max-mutating-requests-inflight=2000 \\
  --max-requests-inflight=4000 \\
  --event-ttl=168h \\
  --alsologtostderr=true \\
  --logtostderr=false \\
  --log-dir=${K8S_LOG_DIR}/${KUBE_NAME} \\
  --v=2
Restart=on-failure
RestartSec=5
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
EOF
  • --advertise-address:apiserver 對外通告的 IP(kubernetes 服務(wù)后端節(jié)點 IP);
  • --default-*-toleration-seconds:設(shè)置節(jié)點異常相關(guān)的閾值;
  • --max-*-requests-inflight:請求相關(guān)的最大閾值;
  • --etcd-*:訪問 etcd 的證書和 etcd 服務(wù)器地址;
  • --experimental-encryption-provider-config:指定用于加密 etcd 中 secret 的配置;
  • --bind-address: https 監(jiān)聽的 IP,不能為 127.0.0.1,否則外界不能訪問它的安全端口 6443;
  • --secret-port:https 監(jiān)聽端口;
  • --insecure-port=0:關(guān)閉監(jiān)聽 http 非安全端口(8080);
  • --tls-*-file:指定 apiserver 使用的證書、私鑰和 CA 文件;
  • --audit-*:配置審計策略和審計日志文件相關(guān)的參數(shù);
  • --client-ca-file:驗證 client (kue-controller-manager、kube-scheduler、kubelet、kube-proxy 等)請求所帶的證書;
  • --enable-bootstrap-token-auth:啟用 kubelet bootstrap 的 token 認證;
  • --requestheader-*:kube-apiserver 的 aggregator layer 相關(guān)的配置參數(shù),proxy-client & HPA 需要使用;
  • --requestheader-client-ca-file:用于簽名 --proxy-client-cert-file 和 --proxy-client-key-file 指定的證書;在啟用了 metric aggregator 時使用;
  • --requestheader-allowed-names:不能為空,值為逗號分割的 --proxy-client-cert-file 證書的 CN 名稱,這里設(shè)置為 "aggregator";
  • --service-account-key-file:簽名 ServiceAccount Token 的公鑰文件,kube-controller-manager 的 --service-account-private-key-file 指定私鑰文件,兩者配對使用;
  • --runtime-config=api/all=true: 啟用所有版本的 APIs,如 autoscaling/v2alpha1;
  • --authorization-mode=Node,RBAC、--anonymous-auth=false: 開啟 Node 和 RBAC 授權(quán)模式,拒絕未授權(quán)的請求;
  • --enable-admission-plugins:啟用一些默認關(guān)閉的 plugins;
  • --allow-privileged:運行執(zhí)行 privileged 權(quán)限的容器;
  • --apiserver-count=3:指定 apiserver 實例的數(shù)量;
  • --event-ttl:指定 events 的保存時間;
  • --kubelet-:如果指定,則使用 https 訪問 kubelet APIs;需要為證書對應(yīng)的用戶(上面 kubernetes.pem 證書的用戶為 kubernetes) 用戶定義 RBAC 規(guī)則,否則訪問 kubelet API 時提示未授權(quán);
  • --proxy-client-*:apiserver 訪問 metrics-server 使用的證書;
  • --service-cluster-ip-range: 指定 Service Cluster IP 地址段;
  • --service-node-port-range: 指定 NodePort 的端口范圍;
  • kube-apiserver 的 --requestheader-allowed-names 參數(shù)需要與metric證書CN字段一致,否則后續(xù)訪問 metrics 時會提示權(quán)限不足。
  • 如果 kube-apiserver 機器沒有運行 kube-proxy,則還需要添加 --enable-aggregator-routing=true 參數(shù);
  • 關(guān)于 --requestheader-XXX 相關(guān)參數(shù),參考:

    https://github.com/kubernetes-incubator/apiserver-builder/blob/master/docs/concepts
    https://docs.bitnami.com/kubernetes/how-to/configure-autoscaling-custom-metrics/

    注意:

    1. requestheader-client-ca-file 指定的 CA 證書,必須具有 client auth and server auth;
    2. 如果 --requestheader-allowed-names 為空,或者 --proxy-client-cert-file 證書的 CN 名稱不在 allowed-names 中,則后續(xù)查看 node 或 pods 的 metrics 失敗,提示:
  • requestheader-client-ca-file 指定的 CA 證書,必須具有 client auth and server auth;
  • 如果 --requestheader-allowed-names 為空,或者 --proxy-client-cert-file 證書的 CN 名稱不在 allowed-names 中,則后續(xù)查看 node 或 pods 的 metrics 失敗,提示:
    ###### Error from server (Forbidden): nodes.metrics.k8s.io is forbidden..
2.6 檢查kube-apiserver服務(wù)及監(jiān)聽的端口
sudo systemctl status kube-apiserver |grep 'Active:'

確保狀態(tài)為 active (running),否則查看日志,確認原因:

sudo journalctl -u kube-apiserver
2.7 打印 kube-apiserver 寫入 etcd 的數(shù)據(jù)(可選)
ETCDCTL_API=3 etcdctl \
    --endpoints=${ETCD_ENDPOINTS} \
    --cacert=/etc/k8s/ssl/ca.pem \
    --cert=/etc/k8s/ssl/etcd.pem \
    --key=/etc/k8s/ssl/etcd-key.pem \
    get /registry/ --prefix --keys-only
2.8 檢查集群信息
kubectl cluster-info
2.9 授予 kube-apiserver 訪問 kubelet API 的權(quán)限

在執(zhí)行 kubectl exec、run、logs 等命令時,apiserver 會將請求轉(zhuǎn)發(fā)到 kubelet 的 https 端口。這里定義 RBAC 規(guī)則,授權(quán) apiserver 使用的證書(kubernetes.pem)用戶名(CN:kuberntes)訪問 kubelet API 的權(quán)限:

kubectl create \
  clusterrolebinding kube-apiserver:kubelet-apis \
  --clusterrole=system:kubelet-api-admin \
  --user kubernetes

kube-apiserver安裝完成,繼續(xù)安裝其他master組件:kube-controller-manager,具體安裝文檔請參考:kubernetes集群安裝指南:kube-controller-manager組件集群部署,關(guān)于kube-apiserver腳本請從此處獲??;

網(wǎng)頁標題:kubernetes集群安裝指南:kube-apiserver組件部署
分享路徑:http://muchs.cn/article20/jchpco.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供移動網(wǎng)站建設(shè)微信公眾號、關(guān)鍵詞優(yōu)化、建站公司、軟件開發(fā)、企業(yè)網(wǎng)站制作

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)頁設(shè)計公司