二進制安裝kubernetes v1.11.2 (第八章 kube-apiserver 部署)

繼續上一章部署。

八、部署kube-apiserver組件

使用第七章的haproxy和keepalived部署的高可用集群提供的VIP:${MASTER_VIP}

8.1 下載二進制文件,參考?第三章 

8.2 創建 kubernetes 證書和私鑰

source /opt/k8s/bin/environment.sh
cat > kubernetes-csr.json <<EOF
{"CN": "kubernetes","hosts": ["127.0.0.1","192.168.56.20","192.168.56.20","${MASTER_VIP}","${CLUSTER_KUBERNETES_SVC_IP}","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": "4Paradigm"}]
}
EOF
  • host 字段指定授權使用該證書的IP或者域名列表,這里列出了 VIP、apiserver節點IP,kubernetes服務IP和域名
  • 域名最后不能是 . (如不能是kubernetes.default.svc.cluster.local.),否則解析失敗,提示 x509: cannot parse dnsName "kubernetes.default.svc.cluster.local."
  • 如果使用非 cluster.local 域名,,如 xxx.com,則需要修改域名列表中的最后兩個域名為:kubernetes.default.svc.xxx、kubernetes.default.svc.xxx.com
  • kubernetes服務IP是apiserver自動創建的,一般是 -service-cluster-ip-range 參數指定的網段的第一個IP,后續可以通過如下命令獲取:
$ kubectl get svc kubernetes
NAME         CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
kubernetes   10.254.0.1   <none>        443/TCP   1d

8.3 生成證書和私鑰

cfssl gencert -ca=/etc/kubernetes/cert/ca.pem \-ca-key=/etc/kubernetes/cert/ca-key.pem \-config=/etc/kubernetes/cert/ca-config.json \-profile=kubernetes kubernetes-csr.json | cfssljson -bare kubernetes
ls kubernetes*pem

8.4 將生成的證書和私鑰文件拷貝到master節點

source /opt/k8s/bin/environment.sh
for master_ip in ${MASTER_IPS[@]}doecho ">>> ${master_ip}"ssh root@${master_ip} "mkdir -p /etc/kubernetes/cert/ && sudo chown -R k8s /etc/kubernetes/cert/"scp kubernetes*.pem k8s@${master_ip}:/etc/kubernetes/cert/
done

8.5 創建加密配置文件

source /opt/k8s/bin/environment.sh
cat > encryption-config.yaml <<EOF
kind: EncryptionConfig
apiVersion: v1
resources:- resources:- secretsproviders:- aescbc:keys:- name: key1secret: ${ENCRYPTION_KEY}- identity: {}
EOF

8.6 將加密配置文件拷貝到 master 節點的 /etc/kubernetes 目錄下

source /opt/k8s/bin/environment.sh
for master_ip in ${MASTER_IPS[@]}doecho ">>> ${master_ip}"scp encryption-config.yaml root@${master_ip}:/etc/kubernetes/
done

替換后的加密配置文件:

[root@k8s-m1 cert]# more encryption-config.yaml 
kind: EncryptionConfig
apiVersion: v1
resources:- resources:- secretsproviders:- aescbc:keys:- name: key1secret: V8NUF8gATb1bZmBke9NRVw33JHt3elTDfNoIi0uhOFI=- identity: {}

8.7 創建 kube-apiserver systemd unit 模板文件

source /opt/k8s/bin/environment.sh
cat > kube-apiserver.service.template <<EOF
[Unit]
Description=Kubernetes API Server
Documentation=https://github.com/GoogleCloudPlatform/kubernetes
After=network.target[Service]
ExecStart=/opt/k8s/bin/kube-apiserver \\--enable-admission-plugins=Initializers,NamespaceLifecycle,NodeRestriction,LimitRanger,ServiceAccount,DefaultStorageClass,ResourceQuota \\--anonymous-auth=false \\--experimental-encryption-provider-config=/etc/kubernetes/encryption-config.yaml \\--advertise-address=##NODE_IP## \\--bind-address=##NODE_IP## \\--insecure-port=0 \\--authorization-mode=Node,RBAC \\--runtime-config=api/all \\--enable-bootstrap-token-auth \\--service-cluster-ip-range=${SERVICE_CIDR} \\--service-node-port-range=${NODE_PORT_RANGE} \\--tls-cert-file=/etc/kubernetes/cert/kubernetes.pem \\--tls-private-key-file=/etc/kubernetes/cert/kubernetes-key.pem \\--client-ca-file=/etc/kubernetes/cert/ca.pem \\--kubelet-client-certificate=/etc/kubernetes/cert/kubernetes.pem \\--kubelet-client-key=/etc/kubernetes/cert/kubernetes-key.pem \\--service-account-key-file=/etc/kubernetes/cert/ca-key.pem \\--etcd-cafile=/etc/kubernetes/cert/ca.pem \\--etcd-certfile=/etc/kubernetes/cert/kubernetes.pem \\--etcd-keyfile=/etc/kubernetes/cert/kubernetes-key.pem \\--etcd-servers=${ETCD_ENDPOINTS} \\--enable-swagger-ui=true \\--allow-privileged=true \\--apiserver-count=2 \\--audit-log-maxage=30 \\--audit-log-maxbackup=3 \\--audit-log-maxsize=100 \\--audit-log-path=/var/log/kube-apiserver-audit.log \\--event-ttl=1h \\--alsologtostderr=true \\--logtostderr=false \\--log-dir=/var/log/kubernetes \\--v=2
Restart=on-failure
RestartSec=5
Type=notify
User=k8s
LimitNOFILE=65536[Install]
WantedBy=multi-user.target
EOF
  • --experimental-encryption-provider-config:啟用加密特性
  • --authorization-mode=Node,RBAC: 開啟 Node 和 RBAC 授權模式,拒絕未授權的請求
  • --enable-admission-plugins:啟用 ServiceAccount 和 NodeRestriction
  • --service-account-key-file:簽名 ServiceAccount Token 的公鑰文件,kube-controller-manager 的 --service-account-private-key-file 指定私鑰文件,兩者配對使用
  • --tls-*-file:指定 apiserver 使用的證書、私鑰和 CA 文件。--client-ca-file 用于驗證 client (kue-controller-manager、kube-scheduler、kubelet、kube-proxy 等)請求所帶的證書
  • --kubelet-client-certificate、--kubelet-client-key:如果指定,則使用 https 訪問 kubelet APIs;需要為證書對應的用戶(上面 kubernetes*.pem 證書的用戶為 kubernetes) 用戶定義 RBAC 規則,否則訪問 kubelet API 時提示未授權
  • --bind-address: 不能為 127.0.0.1,否則外界不能訪問它的安全端口 6443
  • --insecure-port=0:關閉監聽非安全端口(8080)
  • --service-cluster-ip-range: 指定 Service Cluster IP 地址段
  • --service-node-port-range: 指定 NodePort 的端口范圍
  • --runtime-config=api/all=true: 啟用所有版本的 APIs,如 autoscaling/v2alpha1
  • --enable-bootstrap-token-auth:啟用 kubelet bootstrap 的 token 認證
  • --apiserver-count=3:指定集群運行模式,多臺 kube-apiserver 會通過 leader 選舉產生一個工作節點,其它節點處于阻塞狀態
  • User=k8s:使用 k8s 賬戶運行

?

8.8 為各節點創建和分發 kube-apiserver systemd unit 文件

替換模板中的變量,生成各master節點的 systemd unit 文件

source /opt/k8s/bin/environment.sh
for (( i=0; i < 2; i++ ))dosed -e "s/##NODE_NAME##/${NODE_NAMES[i]}/" -e "s/##NODE_IP##/${NODE_IPS[i]}/" kube-apiserver.service.template > kube-apiserver-${NODE_IPS[i]}.service 
done
ls kube-apiserver*.service

8.9 分發生成的 systemd unit 文件

source /opt/k8s/bin/environment.sh
for master_ip in ${MASTER_IPS[@]}doecho ">>> ${master_ip}"ssh root@${master_ip} "mkdir -p /var/log/kubernetes && chown -R k8s /var/log/kubernetes"scp kube-apiserver-${master_ip}.service root@${master_ip}:/etc/systemd/system/kube-apiserver.service
done
  • 需要先創建日志目錄
  • 分發后,文件重命名為 kube-apiserver.service

?8.10 啟動kube-apiserver 服務

source /opt/k8s/bin/environment.sh
for master_ip in ${MASTER_IPS[@]}doecho ">>> ${master_ip}"ssh root@${master_ip} "systemctl daemon-reload && systemctl enable kube-apiserver && systemctl restart kube-apiserver"
done

8.11 檢查 kube-apiserver 運行狀態

source /opt/k8s/bin/environment.sh
for master_ip in ${MASTER_IPS[@]}doecho ">>> ${master_ip}"ssh root@${master_ip} "systemctl status kube-apiserver |grep 'Active:'"
done

確保服務狀態為?Active: active (running)

查看日志的方法:journalctl -u kube-apiserver

8.12 打印 kube-apiserver 寫入 etcd 數據

source /opt/k8s/bin/environment.sh
ETCDCTL_API=3 etcdctl \--endpoints=${ETCD_ENDPOINTS} \--cacert=/etc/kubernetes/cert/ca.pem \--cert=/etc/etcd/cert/etcd.pem \--key=/etc/etcd/cert/etcd-key.pem \get /registry/ --prefix --keys-only

8.13 檢查集群信息

?

[root@k8s-m1 template]# kubectl cluster-info
Kubernetes master is running at https://192.168.56.6:8443

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
[root@k8s-m1 template]# kubectl get all --all-namespaces
NAMESPACE   NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
default     service/kubernetes   ClusterIP   10.254.0.1   <none>        443/TCP   9m
[root@k8s-m1 template]# kubectl get componentstatuses
NAME                 STATUS      MESSAGE                                                                                     ERROR
controller-manager   Unhealthy   Get http://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-0               Healthy     {"health":"true"}                                                                           
etcd-1               Healthy     {"health":"true"}  

8.14?如果執行 kubectl 命令式時輸出如下錯誤信息,則說明使用的 ~/.kube/config 文件不對,請切換到正確的賬戶后再執行該命令:

The connection to the server localhost:8080 was refused - did you specify the right host or port?

8.15?執行 kubectl get componentstatuses 命令時,apiserver 默認向 127.0.0.1 發送請求。當 controller-manager、scheduler 以集群模式運行時,有可能和 kube-apiserver 不在一臺機器上,這時 controller-manager 或 scheduler 的狀態為 Unhealthy,但實際上它們工作正常

8.16 檢查 kube-apiserver 監聽的端口

[root@k8s-m1 template]# sudo netstat -lnpt|grep kube
tcp        0      0 192.168.56.20:6443      0.0.0.0:*               LISTEN      9918/kube-apiserver 
  • 6443? 接收 https 請求的安全端口,對所有請求做認證和授權
  • 由于關閉了非安全端口,所以沒有監聽8080

8.17 授予 kubernetes 證書訪問 kubelet API 的權限

在執行 kubectl exec、run、logs 等命令時,apiserver 會轉發到 kubelet,這里定義RBAC規則

[root@k8s-m1 template]# kubectl create clusterrolebinding kube-apiserver:kubelet-apis --clusterrole=system:kubelet-api-admin --user kubernetes
clusterrolebinding.rbac.authorization.k8s.io/kube-apiserver:kubelet-apis created

?

轉載于:https://www.cnblogs.com/aast/p/9849416.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/396364.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/396364.shtml
英文地址,請注明出處:http://en.pswp.cn/news/396364.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

element手機驗證格式_vue封裝 element-ui form表單驗證 正則匹配手機號 自定義校驗表格內容...

效果image.png在methods中//檢查手機號isCellPhone(val) {if (!/^1(3|4|5|6|7|8)\d{9}$/.test(val)) {return false;} else {return true;}}在template中v-model"forgetForm.phone"type"text"auto-complete"off"placeholder"請輸入你的手機…

multi-mechanize error: can not find test script: v_user.py問題

從github上下載&#xff0c;安裝multi-mechanize&#xff0c;新建工程&#xff0c;運行工程報錯。 環境&#xff1a; win7-x64, python 2.7 multi-mechanize can not find test script: v_user.py 查看了github上的工程&#xff0c;項目無人維護&#xff0c;這個問題2016年11月…

@RequestMapping 用法詳解之地址映射

引言&#xff1a; 前段時間項目中用到了RESTful模式來開發程序&#xff0c;但是當用POST、PUT模式提交數據時&#xff0c;發現服務器端接受不到提交的數據&#xff08;服務器端參數綁定 沒有加任何注解&#xff09;&#xff0c;查看了提交方式為application/json&#xff0c; 而…

我的第一個網頁 代碼_我在免費代碼營的第一個月

我的第一個網頁 代碼by Elliott McNary埃利奧特麥克納里(Elliott McNary) 我在免費代碼營的第一個月 (My First Month At Free Code Camp) I wanted to build an app that would help artists to make more money.我想開發一個可以幫助藝術家賺更多錢的應用。 I had a clear …

java pem rsa_如何從java中的pfx文件/ pem文件中獲取RSA公鑰的指數和模數值

I want to extract information about RSA Public Key from the pfx file using java.我有一個pfx文件并轉換為x509 Pem文件 . 從pem文件&#xff0c;在終端中使用以下命令&#xff1a;openssl x509 -in file.pem -text我能夠查看公鑰指數和模數值主題公鑰信息&#xff1a;Publ…

jmeter+maven+jenkins自動化接口測試(下)

mavenjmeter已經寫好了&#xff0c;可以通過maven來執行jmeter的接口測試腳本&#xff0c;怎樣實現定時執行測試并發送報告郵件就需要通過jenkins了&#xff08;jmeter或者testng也可以結合不同的郵件jar包來發送郵件&#xff0c;這里使用jenkins&#xff09; 安裝jenkins筆記有…

在使用angularjs過程,ng-repeat中track by的作用

轉載&#xff1a;http://segmentfault.com/q/1010000000405730<div ng-repeat"links in slides"> <div ng-repeat"link in links track by $index">link.name</div></div>Error: [ngRepeat:dupes]這個出錯提示具體到題主的情況…

java判斷讀到末尾_IO流如何判斷讀取到了流的結尾,程序中以-1來判斷,是流中寫入一個EOF表示流結束嗎,底層實現呢?...

-1不是流中寫入的數據。read()方法返回的數據都是unsigned byte&#xff0c;即是[0,255]。底層實現有很多&#xff0c;比如socket IO和文件IO&#xff0c;甚至你自己也可以實現。——————————————————————給兩個類的代碼給你看看&#xff0c;理解一下這個東…

結束書

by William Countiss威廉Countiss 結束書 (Closing the Book on Closures) JavaScript closures are an important, but notoriously confusing concept. There’s no escaping it — if you want to grow as a developer, you need to understand what closures are and how …

java激勵_激勵干個人java的不足之處

1.你需要精通面向對象分析與設計(OOA/OOD)、涉及模式(GOF&#xff0c;J2EEDP)以及綜合模式。你應該十分了解UML&#xff0c;尤其是class&#xff0c;object&#xff0c;interaction以及statediagrams。2.你需要學習JAVA語言的基礎知識以及它的核心類庫(collections&#xff0c;…

Bioconductor軟件安裝與升級

1 安裝工具Bioc的軟件包不能使用直接install.packages函數&#xff0c;它有自己的安裝工具&#xff0c;使用下面的代碼&#xff1a; source("https://bioconductor.org/biocLite.R")biocLite() 上面第二個語句將安裝Bioconductor一些基礎軟件包&#xff0c;包括BiocI…

Laravel Kernel引導流程分析

Laravel Kernel引導流程分析 代碼展示 protected function sendRequestThroughRouter($request) {# $this->app->instance(request, $request);# Facade::clearResolvedInstance(request);// 主要是這句代碼$this->bootstrap();# return (new Pipeline($this->app)…

Android RecyclerView (一) 使用完全解析

轉載請標明出處&#xff1a; http://blog.csdn.net/lmj623565791/article/details/45059587&#xff1b; 本文出自:【張鴻洋的博客】 概述 RecyclerView出現已經有一段時間了&#xff0c;相信大家肯定不陌生了&#xff0c;大家可以通過導入support-v7對其進行使用。 據官方的…

數據透視表日期怎么選范圍_透視范圍

數據透視表日期怎么選范圍by Tiffany White蒂芙尼懷特(Tiffany White) 透視范圍 (Putting Scope in Perspective) In JavaScript, lexical scope deals with where your variables are defined, and how they will be accessible — or not accessible — to the rest of your…

feign調用多個服務_Spring Cloud 快速入門系列之feign–微服務之間的調用

我們將一個大的應用拆成多個小的服務之后&#xff0c;緊接著的一個問題就是&#xff0c;原本都在一個項目里&#xff0c;方法我可以隨便調用&#xff0c;但是拆開后&#xff0c;原來的方法就沒法直接調用了&#xff0c;這時候要怎么辦&#xff1f;Spring Cloud提供了feign&…

Asix下日志包沖突

為什么80%的碼農都做不了架構師&#xff1f;>>> Class org.apache.commons.logging.impl.SLF4JLogFactory does not implement org.apache.commons.logging. 最近集成asix包的時候發生如下錯誤&#xff0c;原因是程序運行時logFactoryImple加載了JBOSS下面的sff4j包…

kubernetes中mysql亂碼_在kubernetes中部署tomcat與mysql集群-Go語言中文社區

在kubernetes中部署tomcat與mysql集群之前必須要有以下這些基礎&#xff1a;1. 已安裝、配置kubernetes2. 集群中有tomcat與mysql容器鏡像3. 有docker基礎具體步驟部署tomcat創建tomcat RC對象我們想要在kubernetes集群中配置tomcat服務器&#xff0c;首先要保證集群中的節點上…

c# 測試運行時間毫秒級

long currentMillis (DateTime.Now.Ticks - (new DateTime(1970, 1, 1, 0, 0, 0, 0)).Ticks) / 10000;/*代碼*/long currentMillis1 (DateTime.Now.Ticks - (new DateTime(1970, 1, 1, 0, 0, 0, 0)).Ticks) / 10000;MessageBox.Show((currentMillis1 - currentMillis).ToStri…

nodejs_NodeJS歷險記

nodejsby Elliott McNary埃利奧特麥克納里(Elliott McNary) NodeJS歷險記 (Adventures in NodeJS) I built an app a couple of weeks ago after going through FreeCodeCamp’s Front-End curriculum and wanted to write an update as I head into NodeJS-land. I was final…

pytdx 獲取板塊指數_能否增加一個通過股票代碼,板塊指數代碼獲得中文名稱的接口?...

T0002/hq_cache/shex.tnfT0002/hq_cache/szex.tnf這個解碼就是。/***************************************************股票代碼列表和股票名稱T0002/hq_cache/shex.tnfT0002/hq_cache/szex.tnf***************************************************/struct TdxSymbolMap {cha…