k8s 組件介紹__單Master集羣部署

參考連接: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分鐘

相關文章
相關標籤/搜索