參考連接:https://github.com/opsnull/follow-me-install-kubernetes-clusterhtml
kubernetes 概述
一、kubernetes 是什麼
Google2014年推出的容器集羣管理系統
k8s用於容器化應用程序的部署、擴展和管理
k8s提供了容器編排、資源調度、彈性伸縮、部署管理、服務發現等一系列功能
k8s的目標是讓部署容器化應用簡單高效
總結:能夠理解成一個容器平臺、微服務平臺(很是適合微服務架構)、便攜式雲平臺
二、kebernetes 能作什麼
三、kubernetes 特性
3.1 自我修復:
在節點故障時從新啓動失敗的容器,替換和從新部署,保證預期咱們設置的副本的數量;
殺死健康檢車失敗的容器,而且在沒有準備好以前是不會處理客戶端請求的(不對外提供服務),保證線上服務不中斷
3.2 彈性伸縮(好比618活動,保證咱們服務的快速縮容和擴容):
使用命令、UI或者基於CPU使用狀況自動快速擴容和縮容應用的程序實例(容器的副本數),
保證應用業務高峯併發時的高可用性;
在業務低峯時期回收資源,以減少成本運行服務
3.3 自動部署和回滾
k8s 採用滾動更新的策略更新應用,一次更新一個Pod,而不是同時刪除全部的pod,若是更新過程當中出現問題,將回滾更改,確保升級不影響業務
3.4 服務發現和負載均衡
k8s爲多個容器提供一個統一訪問入口(內部IP地址和一個DNS名稱),而且負載均衡關聯的全部容器,使得用戶無需考慮容器IP的問題
3.5 機密數據(密碼,證書)和配置管理
k8s提供存儲能力(能夠把密碼加密放在容器存儲中)
管理機密數據和應用程序的配置,而不須要把敏感的數據暴露在鏡像裏,提升敏感數據的安全性,而且能夠把一些經常使用的配置存儲在k8s中,方便應用程序的使用
3.6 存儲編排
掛載外部的存儲系統,不管是來自本地存儲,公有云,仍是網絡存儲(NFS《GlustFS,Ceph)
都做爲集羣資源的一部分使用,極大的提升存儲使用靈活性
3.7 批處理
提供一次性任務,定時任務,知足批量數據處理和分析的場景
四、Kubernetes 集羣架構與組件(http://docs.kubernetes.org.cn/251.html)node
master+2node
master組件(集羣中控制面板的功能,來管理整個集羣,控制包括全局的角色和調度)linux
kubectl 是一個客戶端的管理工具,直接管理API server,提供一個請求到一個api server,中間有一個auth認證(判斷是否有權限訪問),api 將信息存儲到etcd數據庫中,而後scheduler和
API Server(k8s 提供的整個集羣統一入口,提供了http RESTFUl api 的方式)
controller-manager作各自的事情
scheduler 作集羣節點的調度
contorller-manager 負責任務(控制器)
Node 組件
kubelet:接受k8s 下發的任務(主要管理k8s容器的建立和一些生命週期的管理)
kube-proxy :負責網路代理,維護網絡規則和四層的負載均衡,怎樣才能讓下面的Pod(一個或者多個容器)能對外提供服務git
Pod 由多個或者一個容器組成
架構圖:
github
總結:算法
Master 組件:docker
kube-apiserver :
Kubernetes API 集羣的統一入口,各組件的協調者,以RESTful API提供接口方式,全部的對象資源的數據庫
增刪改查和監聽操做都交給APIServer處理後再提交給etcd數據庫作持久化存儲json
Kube-controller-manager
處理集羣中常規後臺任務,一個資源對應一個控制器,而controllerManager就是負責處理這些控制器的bootstrap
kube-scheduler
根據調度算法爲新建立的pod選擇一個Node節點,能夠任意部署,能夠部署在同一個節點上,也能夠部署在不一樣的節點上
etcd
分佈式鍵值存儲系統,用於保存集羣狀態數據,好比Pod,Service等對象信息
Node組件:
kubelet:
kubelet 是Master在Node節點上的Agent,管理本機運行容器的生命週期,好比建立容器,Pod掛載數據卷,下載secret,獲取容器和節點狀態等工做,kubelet 將每一個Pod轉換成一組容器
kube-proxy:
在Node節點上實現Pod網絡代理,維護網絡規則和四層負載均衡工做。實現讓Pod節點(一個或者多個容器)對外提供服務
docker或rocket
容器引擎,運行容器
五、Kubernetes 核心概念
模型對象
POd 一個或者多個容器組成,k8s的最小組成單元
k8s 集羣部署
環境:
centos 7.x k8s 1.12 docker 18.xx-ce etcd 3.x flannel 0.10爲全部容器提供能夠跨機器網絡訪問 利用etcd 存儲網絡路由
方式一 minkube: 適用於平常開發適用
方式二 kubeadm
問題:
(1)開發的證書一年
(2)版本仍是在測試階段
方式三 二進制方式:推薦
最新穩定版本v1.12.3
https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG-1.12.md#v1123
集羣模式選擇:
單Master集羣:
master 掛了,整個集羣就掛了
多Master集羣:前面要加一個LB,全部的node都要鏈接lb,lb幫忙轉發到apiserver,而後apiserver再進行相應的操做
這裏咱們先部署單master 集羣的方式:
打開三臺虛擬機
如今由單master開始,而後擴展到多master
1.一個master,兩個node
2.三臺機器都裝上etcd,組成集羣(建議三臺容許壞一臺,官方建議五臺容許壞兩臺)
3.安裝cfssl
4.自簽證書,利用openssl或者cfssl,這裏用cfssl(簡單)
cfssl 生成證書
cfssljson 傳入json文件生成證書
cfssl-certinfo 能夠查看生成證書的信息
腳本中的hosts 是部署etcd的機器IP
5.爲etcd簽發ssl證書
三臺主機IP是
192.168.20.11 master kube-apiserver kube-controller-manager kube-scheduler etcd 192.168.20.12 node kubelet kube-proxy docker fannel etcd 192.168.20.13 node kubelet kube-proxy docker fannel etcd
在安裝etcd 以前咱們先製做自籤CA證書
install_cfssl.sh
#######
curl -L https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 -o /usr/local/bin/cfssl
curl -L https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64 -o /usr/local/bin/cfssljson
curl -L https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64 -o /usr/local/bin/cfssl-certinfo
chmod +x /usr/local/bin/cfssl /usr/local/bin/cfssljson /usr/local/bin/cfssl-certinfo
etcd_cert.sh ######### cat > ca-config.json <<EOF { "signing": { "default": { "expiry": "87600h" }, "profiles": { "www": { "expiry": "87600h", "usages": [ "signing", "key encipherment", "server auth", "client auth" ] } } } } EOF cat > ca-csr.json <<EOF { "CN": "etcd CA", "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "CN", "L": "Beijing", "ST": "Beijing" } ] } EOF cfssl gencert -initca ca-csr.json | cfssljson -bare ca - #----------------------- cat > server-csr.json <<EOF { "CN": "etcd", "hosts": [ "192.168.20.11", "192.168.20.12", "192.168.20.13" ], "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "CN", "L": "BeiJing", "ST": "BeiJing" } ] } EOF cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=www server-csr.json | cfssljson -bare server
sh install_cfssl.sh
sh etcd_cert.sh 執行後生成下面文件
[root@hu-001 etcd-cert]# ll total 44 -rw-r--r-- 1 root root 287 Dec 4 04:01 ca-config.json -rw-r--r-- 1 root root 956 Dec 4 04:01 ca.csr -rw-r--r-- 1 root root 209 Dec 4 04:01 ca-csr.json -rw------- 1 root root 1679 Dec 4 04:01 ca-key.pem -rw-r--r-- 1 root root 1265 Dec 4 04:01 ca.pem -rw-r--r-- 1 root root 1088 Aug 27 09:51 etcd-cert.sh -rw-r--r-- 1 root root 1013 Dec 4 04:01 server.csr -rw-r--r-- 1 root root 293 Dec 4 04:01 server-csr.json -rw------- 1 root root 1679 Dec 4 04:01 server-key.pem -rw-r--r-- 1 root root 1338 Dec 4 04:01 server.pem
而後咱們將咱們下載的etcd的包上傳到服務器上(觀看時間一小時,正在部署etcd,有問題)
看一下etcd的啓動參數的含義
2379和2380端口分別表明啥
2379 數據端口
2380 集羣端口
etcd 集羣部署完畢以後,咱們使用etcdctl 來檢測各個節點是否健康
node 節點安裝Docker
Flannel 容器集羣網絡的部署
Overlay Network
VXLAN
Flannel
Calico(大公司用的網絡架構https://www.cnblogs.com/netonline/p/9720279.html)
Flannel 網絡原理
首先以前咱們得寫入分配的子網段到etcd中,供flannel使用
配置的網段必定不能和宿主機的網段相同,寫入網段,以及網絡類型到etcd中
啓動完Flannel後咱們要重啓一下Docker,保證Container 和 flannel 在一個網段
而後咱們在兩臺宿主機下再分別啓動一個Docker容器,咱們ping 對方的容器,雖然網段不一樣,可是仍是能夠ping通的(Flannel起的做用)
接下來部署k8s組件
master:
必須首先部署apiserver,其餘兩個組件無序
首先咱們得給kube-apiserver 自籤一個證書
k8s_cert.sh ############################################### cat > ca-config.json <<EOF { "signing": { "default": { "expiry": "87600h" }, "profiles": { "kubernetes": { "expiry": "87600h", "usages": [ "signing", "key encipherment", "server auth", "client auth" ] } } } } EOF cat > ca-csr.json <<EOF { "CN": "kubernetes", "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "CN", "L": "Beijing", "ST": "Beijing", "O": "k8s", "OU": "System" } ] } EOF cfssl gencert -initca ca-csr.json | cfssljson -bare ca - #----------------------- cat > server-csr.json <<EOF { "CN": "kubernetes", "hosts": [ "10.0.0.1",#不要修改 "127.0.0.1",#不要修改 "192.168.20.11", #master_ip,LB_ip,vip "kubernetes", "kubernetes.default", "kubernetes.default.svc", "kubernetes.default.svc.cluster", "kubernetes.default.svc.cluster.local" ], "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "CN", "L": "BeiJing", "ST": "BeiJing", "O": "k8s", #不要修改 "OU": "System" #不要修改 } ] } EOF cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes server-csr.json | cfssljson -bare server #----------------------- cat > admin-csr.json <<EOF { "CN": "admin", "hosts": [], "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "CN", "L": "BeiJing", "ST": "BeiJing", "O": "system:masters", "OU": "System" } ] } EOF cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes admin-csr.json | cfssljson -bare admin #----------------------- cat > kube-proxy-csr.json <<EOF { "CN": "system:kube-proxy", "hosts": [], "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "CN", "L": "BeiJing", "ST": "BeiJing", "O": "k8s", "OU": "System" } ] } EOF cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes kube-proxy-csr.json | cfssljson -bare kube-proxy
部署Apiserver組件
apiserver.sh ################################################# #!/bin/bash MASTER_ADDRESS=$1 ETCD_SERVERS=$2 cat <<EOF >/opt/kubernetes/cfg/kube-apiserver KUBE_APISERVER_OPTS="--logtostderr=true \\ --v=4 \\ #日誌級別 --etcd-servers=${ETCD_SERVERS} \\ # etcd地址 --bind-address=${MASTER_ADDRESS} \\ # 綁定當前IP --secure-port=6443 \\ #默認監聽端口 --advertise-address=${MASTER_ADDRESS} \\ #集羣通告地址 --allow-privileged=true \\ --service-cluster-ip-range=10.0.0.0/24 \\ --enable-admission-plugins=NamespaceLifecycle,LimitRanger,ServiceAccount,ResourceQuota,NodeRestriction \\ 啓用准入控制 --authorization-mode=RBAC,Node \\ --kubelet-https=true \\ --enable-bootstrap-token-auth \\ # 啓用token認證 --token-auth-file=/opt/kubernetes/cfg/token.csv \\ #token認證文件 --service-node-port-range=30000-50000 \\ --tls-cert-file=/opt/kubernetes/ssl/server.pem \\ --tls-private-key-file=/opt/kubernetes/ssl/server-key.pem \\ --client-ca-file=/opt/kubernetes/ssl/ca.pem \\ --service-account-key-file=/opt/kubernetes/ssl/ca-key.pem \\ --etcd-cafile=/opt/etcd/ssl/ca.pem \\ --etcd-certfile=/opt/etcd/ssl/server.pem \\ --etcd-keyfile=/opt/etcd/ssl/server-key.pem" EOF cat <<EOF >/usr/lib/systemd/system/kube-apiserver.service [Unit] Description=Kubernetes API Server Documentation=https://github.com/kubernetes/kubernetes [Service] EnvironmentFile=-/opt/kubernetes/cfg/kube-apiserver ExecStart=/opt/kubernetes/bin/kube-apiserver \$KUBE_APISERVER_OPTS Restart=on-failure [Install] WantedBy=multi-user.target EOF systemctl daemon-reload systemctl enable kube-apiserver systemctl restart kube-apiserver
具體的操做步驟以下:
k8s 單Master集羣的部署
筆記連接:
https://www.jianshu.com/p/33b5f47ababc
一、安裝cfssl工具(使用下面的腳步安裝cfssl)
curl -L https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 -o /usr/local/bin/cfssl
curl -L https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64 -o /usr/local/bin/cfssljson
curl -L https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64 -o /usr/local/bin/cfssl-certinfo
chmod +x /usr/local/bin/cfssl /usr/local/bin/cfssljson /usr/local/bin/cfssl-certinfo
[root@hu-001 tools]# ls -lh /usr/local/bin/cfssl*
-rwxr-xr-x 1 root root 9.9M Dec 4 03:57 /usr/local/bin/cfssl
-rwxr-xr-x 1 root root 6.3M Dec 4 03:58 /usr/local/bin/cfssl-certinfo
-rwxr-xr-x 1 root root 2.2M Dec 4 03:58 /usr/local/bin/cfssljson
二、使用cfssl建立CA證書以及etcd的TLS認證證書
2.1 建立CA證書
mkdir /data/k8s/etcd-cert/ 建立一個專門用來生成ca證書的文件夾
cd /data/k8s/etcd-cert
建立CA配置文件
cat > ca-config.json <<EOF
{
"signing": {
"default": {
"expiry": "87600h"
},
"profiles": {
"www": {
"expiry": "87600h",
"usages": [
"signing",
"key encipherment",
"server auth",
"client auth"
]
}
}
}
}
EOF
字段解釋:
"ca-config.json":能夠定義多個 profiles,分別指定不一樣的過時時間、使用場景等參數;後續在簽名證書時使用某個 profile;
"signing":表示該證書可用於簽名其它證書;生成的 ca.pem 證書中 CA=TRUE;
"server auth":表示client能夠用該 CA 對server提供的證書進行驗證;
"client auth":表示server能夠用該CA對client提供的證書進行驗證;
建立CA證書籤名請求
cat > ca-csr.json <<EOF
{
"CN": "etcd CA",
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "Beijing",
"ST": "Beijing"
}
]
}
EOF
字段解釋:
"CN":Common Name,etcd 從證書中提取該字段做爲請求的用戶名 (User Name);瀏覽器使用該字段驗證網站是否合法;
"O":Organization,etcd 從證書中提取該字段做爲請求用戶所屬的組 (Group);
這兩個參數在後面的kubernetes啓用RBAC模式中很重要,由於須要設置kubelet、admin等角色權限,那麼在配置證書的時候就必須配置對了,具體後面在部署kubernetes的時候會進行講解。
"在etcd這兩個參數沒太大的重要意義,跟着配置就好。"
接下來就是生成CA證書和私鑰了
cfssl gencert -initca ca-csr.json | cfssljson -bare ca -
這個命令生成了"ca-csr.json ca-key.pem ca.pem"三個文件
三、建立Etcd的TLS認證證書:
建立etcd證書籤名請求
cat > server-csr.json <<EOF
{
"CN": "etcd",
"hosts": [
"192.168.20.11",
"192.168.20.12",
"192.168.20.13"
],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "BeiJing",
"ST": "BeiJing"
}
]
}
EOF
字段解釋:
hosts:這裏填寫etcd集羣節點機器的IP(能夠理解成信任列表),指定受權使用該證書的IP列表
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=www server-csr.json | cfssljson -bare server
上面的命令生成 "server-csr.json server-key.pem server.pem" 三個文件
這裏咱們能夠把TLS認證文件拷貝到本身經常使用位置證書目錄下或者當前位置
cp *pem /data/etcd/ssl/
咱們能夠把上面的幾個步驟放在一個腳本里執行
我的建議,由於是部署集羣(我的虛擬機環境),這裏咱們最好仍是關閉防火牆以及進行時間同步
四、接下來就是安裝etcd服務了
將咱們下載好的包文件上傳到服務器上(可自行下載https://github.com/etcd-io/etcd/releases)
etcd-v3.3.10-linux-amd64.tar.gz
mkdir -p /data/etcd/{cfg,bin,ssl}
cp /data/k8s/etcd-cert/{server-csr.json,server-key.pem,server.pem} /data/etcd/ssl/
tar -xf etcd-v3.3.10-linux-amd64.tar.gz
cp etcd-v3.3.10-linux-amd64/etcd /data/etcd/bin
cp etcd-v3.3.10-linux-amd64/etcdctl /data/etcd/bin
[root@hu-001 etcd-cert]# cat etcd.sh
#!/bin/bash
# example: ./etcd.sh etcd01 192.168.20.11 etcd02=https://192.168.20.12:2380,etcd03=https://192.168.20.13:2380
ETCD_NAME=$1
ETCD_IP=$2
ETCD_CLUSTER=$3
WORK_DIR=/data/etcd
cat <<EOF >$WORK_DIR/cfg/etcd
#[Member]
ETCD_NAME="${ETCD_NAME}"
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_PEER_URLS="https://${ETCD_IP}:2380"
ETCD_LISTEN_CLIENT_URLS="https://${ETCD_IP}:2379"
#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="https://${ETCD_IP}:2380"
ETCD_ADVERTISE_CLIENT_URLS="https://${ETCD_IP}:2379"
ETCD_INITIAL_CLUSTER="etcd01=https://${ETCD_IP}:2380,${ETCD_CLUSTER}"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"
EOF
cat <<EOF >/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=${WORK_DIR}/cfg/etcd
ExecStart=${WORK_DIR}/bin/etcd \
--name=\${ETCD_NAME} \
--data-dir=\${ETCD_DATA_DIR} \
--listen-peer-urls=\${ETCD_LISTEN_PEER_URLS} \
--listen-client-urls=\${ETCD_LISTEN_CLIENT_URLS},http://127.0.0.1:2379 \
--advertise-client-urls=\${ETCD_ADVERTISE_CLIENT_URLS} \
--initial-advertise-peer-urls=\${ETCD_INITIAL_ADVERTISE_PEER_URLS} \
--initial-cluster=\${ETCD_INITIAL_CLUSTER} \
--initial-cluster-token=\${ETCD_INITIAL_CLUSTER_TOKEN} \
--initial-cluster-state=new \
--cert-file=${WORK_DIR}/ssl/server.pem \
--key-file=${WORK_DIR}/ssl/server-key.pem \
--peer-cert-file=${WORK_DIR}/ssl/server.pem \
--peer-key-file=${WORK_DIR}/ssl/server-key.pem \
--trusted-ca-file=${WORK_DIR}/ssl/ca.pem \
--peer-trusted-ca-file=${WORK_DIR}/ssl/ca.pem
Restart=on-failure
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable etcd
systemctl restart etcd
這個時候咱們查看一下etcd的狀態 systemctl status etcd.service ,看到該節點已經起來了
參數解釋:
參數說明:
一、指定 etcd 的工做目錄爲 /var/lib/etcd,數據目錄爲 /var/lib/etcd,需在啓動服務前建立這兩個目錄;
在配置中的命令是這條:
WorkingDirectory=/var/lib/etcd/
二、爲了保證通訊安全,須要指定 etcd 的公私鑰(cert-file和key-file)、Peers 通訊的公私鑰和 CA 證書(peer-cert-file、peer-key-file、peer-trusted-ca-file)、客戶端的CA證書(trusted-ca-file);
在配置中添加etcd證書的命令是如下:
--cert-file=/data/etcd/ssl/server.pem \
--key-file=/data/etcd/ssl/server-key.pem \
--peer-cert-file=/data/etcd/ssl/server.pem \
--peer-key-file=/data/etcd/ssl/server-key.pem \
--trusted-ca-file=/data/etcd/ssl/ca.pem \
--peer-trusted-ca-file=/data/etcd/ssl/ca.pem
#三、配置etcd的endpoint:
# --initial-cluster infra1=https://172.16.5.81:2380 \
四、配置etcd的監聽服務集羣:
--initial-advertise-peer-urls ${ETCD_INITIAL_ADVERTISE_PEER_URLS} \
--listen-peer-urls ${ETCD_LISTEN_PEER_URLS} \
--listen-client-urls ${ETCD_LISTEN_CLIENT_URLS},http://127.0.0.1:2379 \
--advertise-client-urls ${ETCD_ADVERTISE_CLIENT_URLS} \
五、配置etcd建立的集羣爲新集羣,則定義集羣狀態爲new
--initial-cluster-state 值爲 new
六、定義etcd節點的名稱,該名稱等下從配置文件中獲取:
--name ${ETCD_NAME} \
其中配置文件:EnvironmentFile=/data/etcd/cfg/etcd
這個時候咱們把上面相應的文件拷貝到另外兩臺節點上
ssh-keygen
ssh-copy-id root@192.168.20.12
ssh-copy-id root@192.168.20.13
scp -r /data/etcd root@192.168.20.12:/data/
scp -r /data/etcd root@192.168.20.13:/data/
scp /usr/lib/systemd/system/etcd.service root@192.168.20.12:/usr/lib/systemd/system/
scp /usr/lib/systemd/system/etcd.service root@192.168.20.13:/usr/lib/systemd/system/
而後咱們再去修改另外兩臺節點的配置文件
vim /data/etcd/cfg/etcd
#[Member]
ETCD_NAME="etcd03"
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_PEER_URLS="https://192.168.20.13:2380"
ETCD_LISTEN_CLIENT_URLS="https://192.168.20.13:2379"
#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="https://192.168.20.13:2380"
ETCD_ADVERTISE_CLIENT_URLS="https://192.168.20.13:2379"
ETCD_INITIAL_CLUSTER="etcd01=https://192.168.20.11:2380,etcd02=https://192.168.20.12:2380,etcd03=https://192.168.20.13:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"
systemctl daemon-reload
systemctl enable etcd
systemctl restart etcd
至此三個節點的etcd集羣就部署好了
監測一下etcd集羣服務的健康狀態:
[root@hu-001 etcd-v3.3.10-linux-amd64]# /data/etcd/bin/etcdctl \
> --ca-file=/data/etcd/ssl/ca.pem \
> --cert-file=/data/etcd/ssl/server.pem \
> --key-file=/data/etcd/ssl/server-key.pem cluster-health
member 98aa99c4dcd6c4 is healthy: got healthy result from https://192.168.20.11:2379
member 12446003b2a53d43 is healthy: got healthy result from https://192.168.20.12:2379
member 667c9c7ba890c3f7 is healthy: got healthy result from https://192.168.20.13:2379
cluster is healthy
Node節點安裝Docker
安裝Docker環境所須要的依賴包
yum install -y yum-utils device-mapper-persistent-data lvm2
添加Docker軟件包源
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.re
使用上面的源可能會安裝失敗。這裏時候咱們能夠選擇使用阿里的
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
安裝Docker-CE
yum -y install docker-ce
啓動Docker服務並設置開機啓動
systemctl start docker
systemctl enable docker
Flannel 集羣網絡部署
接下來就是部署容器集羣Flannel網絡了
https://www.cnblogs.com/kevingrace/p/6859114.html
首先咱們寫入分配的子網段(和宿主機不要在一個網段)到etcd中,供flannel使用
/data/etcd/bin/etcdctl --ca-file=/data/etcd/ssl/ca.pem --cert-file=/data/etcd/ssl/server.pem --key-file=/data/etcd/ssl/server-key.pem --endpoints="https://192.168.20.11:2379,https://192.168.20.12:2379,https://192.168.20.13:2379" set /coreos.com/network/config '{"Network":"192.168.10.0/16","Backend":{"Type":"vxlan"}}'
這裏咱們宿主機的網段是192.168.20.0,咱們給flannel 分配的望斷時192.168.10.0
聲明網絡類型爲vxlan
給各node主機上傳flannel網絡包
flannel-v0.10.0-linux-amd64.tar.gz
mkdir /data/kubernetes/{bin,cfg,ssl}
tar -xf flannel-v0.10.0-linux-amd64.tar.gz -C /data/kubernetes/bin/
而後執行下面的腳本:
這裏在操做的時候把Docker的給先去掉,其實只是在原有的Docker啓動腳本上加上了兩行,這裏咱們能夠單獨手動修改,或者後面完善腳本也能夠
#!/bin/bash ETCD_ENDPOINTS=${1:-"http://127.0.0.1:2379"} #" ${1:-"http://127.0.0.1:2379"} "解釋 第一個參數要是不傳的話就使用http://127.0.0.1:2379 cat <<EOF >/data/kubernetes/cfg/flanneld FLANNEL_dataIONS="--etcd-endpoints=${ETCD_ENDPOINTS} \ -etcd-cafile=/data/etcd/ssl/ca.pem \ -etcd-certfile=/data/etcd/ssl/server.pem \ -etcd-keyfile=/data/etcd/ssl/server-key.pem" EOF cat <<EOF >/usr/lib/systemd/system/flanneld.service [Unit] Description=Flanneld overlay address etcd agent After=network-online.target network.target Before=docker.service [Service] Type=notify EnvironmentFile=/data/kubernetes/cfg/flanneld ExecStart=/data/kubernetes/bin/flanneld --ip-masq \$FLANNEL_dataIONS ExecStartPost=/data/kubernetes/bin/mk-docker-opts.sh -k DOCKER_NETWORK_dataIONS -d /run/flannel/subnet.env Restart=on-failure [Install] WantedBy=multi-user.target EOF #這裏生成子網信息到/run/flannel/subnet.env,而後Docker啓動的時候從這裏獲取子網信息 #修改Docker的網絡,新增下面兩行,修改後在啓動flannel 成功後記得要重啓docker服務 #EnvironmentFile=/run/flannel/subnet.env #ExecStart=/usr/bin/dockerd \$DOCKER_NETWORK_dataIONS cat <<EOF >/usr/lib/systemd/system/docker.service [Unit] Description=Docker Application Container Engine Documentation=https://docs.docker.com After=network-online.target firewalld.service Wants=network-online.target [Service] Type=notify EnvironmentFile=/run/flannel/subnet.env ExecStart=/usr/bin/dockerd \$DOCKER_NETWORK_dataIONS ExecReload=/bin/kill -s HUP \$MAINPID LimitNOFILE=infinity LimitNPROC=infinity LimitCORE=infinity TimeoutStartSec=0 Delegate=yes KillMode=process Restart=on-failure StartLimitBurst=3 StartLimitInterval=60s [Install] WantedBy=multi-user.target EOF systemctl daemon-reload systemctl enable flanneld systemctl restart flanneld systemctl restart docker
#!/bin/bash
ETCD_ENDPOINTS=${1:-"http://127.0.0.1:2379"}
#" ${1:-"http://127.0.0.1:2379"} "解釋 第一個參數要是不傳的話就使用http://127.0.0.1:2379
cat <<EOF >/data/kubernetes/cfg/flanneld
FLANNEL_dataIONS="--etcd-endpoints=${ETCD_ENDPOINTS} \
-etcd-cafile=/data/etcd/ssl/ca.pem \
-etcd-certfile=/data/etcd/ssl/server.pem \
-etcd-keyfile=/data/etcd/ssl/server-key.pem"
EOF
cat <<EOF >/usr/lib/systemd/system/flanneld.service
[Unit]
Description=Flanneld overlay address etcd agent
After=network-online.target network.target
Before=docker.service
[Service]
Type=notify
EnvironmentFile=/data/kubernetes/cfg/flanneld
ExecStart=/data/kubernetes/bin/flanneld --ip-masq \$FLANNEL_dataIONS
ExecStartPost=/data/kubernetes/bin/mk-docker-opts.sh -k DOCKER_NETWORK_dataIONS -d /run/flannel/subnet.env
Restart=on-failure
[Install]
WantedBy=multi-user.target
EOF
#這裏生成子網信息到/run/flannel/subnet.env,而後Docker啓動的時候從這裏獲取子網信息
#修改Docker的網絡,新增下面兩行,修改後在啓動flannel 成功後記得要重啓docker服務
#EnvironmentFile=/run/flannel/subnet.env
#ExecStart=/usr/bin/dockerd $DOCKER_NETWORK_dataIONS
systemctl daemon-reload
systemctl enable flanneld
systemctl restart flanneld
systemctl restart docker
這樣咱們看到兩臺Node節點的網絡狀況是這樣的
咱們看到兩臺處於不一樣的網段,可是確實能夠互ping相通
這個時候咱們能夠在兩臺Node節點上分別啓動一個容器,而後看兩個容器的網絡是否相通
部署Master組件
必須第一部署apiserver,其餘兩個組件能夠不按順序
首先利用腳本自籤一個apiserver用到的證書:
cat > ca-config.json <<EOF { "signing": { "default": { "expiry": "87600h" }, "profiles": { "kubernetes": { "expiry": "87600h", "usages": [ "signing", "key encipherment", "server auth", "client auth" ] } } } } EOF cat > ca-csr.json <<EOF { "CN": "kubernetes", "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "CN", "L": "Beijing", "ST": "Beijing", "O": "k8s", "OU": "System" } ] } EOF cfssl gencert -initca ca-csr.json | cfssljson -bare ca - #----------------------- cat > server-csr.json <<EOF { "CN": "kubernetes", "hosts": [ "10.0.0.1", "127.0.0.1", "192.168.20.11", "192.168.20.12", "192.168.20.13", "kubernetes", "kubernetes.default", "kubernetes.default.svc", "kubernetes.default.svc.cluster", "kubernetes.default.svc.cluster.local" ], "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "CN", "L": "BeiJing", "ST": "BeiJing", "O": "k8s", "OU": "System" } ] } EOF # 這裏的hosts中10.0.0.1,127.0.0.1 不要刪除了,k8s自用,而後咱們加上master_ip,LB_ip,Vip cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes server-csr.json | cfssljson -bare server #----------------------- cat > admin-csr.json <<EOF { "CN": "admin", "hosts": [], "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "CN", "L": "BeiJing", "ST": "BeiJing", "O": "system:masters", "OU": "System" } ] } EOF cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes admin-csr.json | cfssljson -bare admin #----------------------- cat > kube-proxy-csr.json <<EOF { "CN": "system:kube-proxy", "hosts": [], "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "CN", "L": "BeiJing", "ST": "BeiJing", "O": "k8s", "OU": "System" } ] } EOF cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes kube-proxy-csr.json | cfssljson -bare kube-proxy
mkdir /data/kubernetes/{bin,ssl,cfg} -p
mv ca.pem server.pem ca-key.pem server-key.pem /data/kubernetes/ssl/
[root@hu-001 tools]# tar -xf kubernetes-server-linux-amd64.tar.gz
解壓後拷貝須要的可執行文件
[root@hu-001 bin]# cp kubectl kube-apiserver kube-controller-manager kube-scheduler /data/kubernetes/bin/
使用下面的命令
# 建立 TLS Bootstrapping Token
#BOOTSTRAP_TOKEN=$(head -c 16 /dev/urandom | od -An -t x | tr -d ' ')
[root@hu-001 master_sh]# cat /data/kubernetes/cfg/token.csv f23bd9cb6289ab11ddb622ec9de9ed6f,kubelet-bootstrap,10001,"system:kubelet-bootstrap"
apiserver.sh腳本內容以下:
#!/bin/bash MASTER_ADDRESS=$1 ETCD_SERVERS=$2 mkdir -p /data/kubernetes/{cfg,bin,ssl} cat <<EOF >/data/kubernetes/cfg/kube-apiserver KUBE_APISERVER_dataS="--logtostderr=true \\ --v=4 \\ --etcd-servers=${ETCD_SERVERS} \\ --bind-address=${MASTER_ADDRESS} \\ --secure-port=6443 \\ --advertise-address=${MASTER_ADDRESS} \\ --allow-privileged=true \\ --service-cluster-ip-range=10.0.0.0/24 \\ --enable-admission-plugins=NamespaceLifecycle,LimitRanger,ServiceAccount,ResourceQuota,NodeRestriction \\ --authorization-mode=RBAC,Node \\ --kubelet-https=true \\ --enable-bootstrap-token-auth \\ --token-auth-file=/data/kubernetes/cfg/token.csv \\ --service-node-port-range=30000-50000 \\ --tls-cert-file=/data/kubernetes/ssl/server.pem \\ --tls-private-key-file=/data/kubernetes/ssl/server-key.pem \\ --client-ca-file=/data/kubernetes/ssl/ca.pem \\ --service-account-key-file=/data/kubernetes/ssl/ca-key.pem \\ --etcd-cafile=/data/etcd/ssl/ca.pem \\ --etcd-certfile=/data/etcd/ssl/server.pem \\ --etcd-keyfile=/data/etcd/ssl/server-key.pem" EOF cat <<EOF >/usr/lib/systemd/system/kube-apiserver.service [Unit] Description=Kubernetes API Server Documentation=https://github.com/kubernetes/kubernetes [Service] EnvironmentFile=-/data/kubernetes/cfg/kube-apiserver ExecStart=/data/kubernetes/bin/kube-apiserver \$KUBE_APISERVER_dataS Restart=on-failure [Install] WantedBy=multi-user.target EOF systemctl daemon-reload systemctl enable kube-apiserver systemctl restart kube-apiserver
[root@hu-001 master_sh]# sh apiserver.sh 192.168.20.11 https://192.168.20.11:2379,https://192.168.20.12:2379,https://192.168.20.13:2379
至此kube-apiserver 就已經啓動成功了,觀看時間到38分鐘