kubernetes容器集羣管理(1)-集羣規劃、TSL協議證書、Etcd集羣搭建

目錄

1、特性

2、基本對象概念

3、集羣部署提前規劃

4、node節點機器部署docker

5、master部署自籤TSL證書

6、部署etcd集羣

1、特性

自動化容器的部署和複製
隨時擴展或收縮容器規模
將容器組織成組,並且提供容器間的負載均衡
很容易地升級應用程序容器的新版本
提供容器彈性,如果容器失效就替換它

 

2、基本對象概念

#基本對象概念

Pod:
最小部署單元。一個pod有一個或多個容器,共享網絡與存儲
Service:
應用服務抽象。定義了Pod邏輯集合和訪問這個Pod集合的策略。Service通過Lable Selector選擇一組Pod提供服務。
Volume:
數據卷。共享Pod中容器使用的數據。
Namespace:
命名空間。將對象邏輯上分配到不同Namespace,可以使不同的項目、用戶等區分管理,並設定控制策略,從而實現多租戶。
命名空間也稱爲虛擬集羣。
Lable:
標籤。用於區分對象(比如Pod、Service),鍵/值對存在;每個對象可以有多個標籤,通過標籤關聯對象。

#基於基本對象更高層次抽象:

ReplicaSet:
下一代Replication Controller。確保任何給定時間指定的Pod副本數量,並提供聲明式更新等功能。
RC與RS唯一區別就是lable selectore支持不同,RS支持新的基於集合的標籤,RC僅支持基於等式的標籤。
Deployment:
Deployment是一個更高層次的API對象,他管理ReplicaSets和Pod,並提供聲明式更新等功能。
官方建議使用Deployment管理ReplicaSets,而不是直接使用ReplicaSets,這就意味着可能永遠不需要直接操作ReplicaSet對象。
StatefulSet:
StatefulSet適合持久性的應用程序,有唯一的網絡標識符(IP),持久存儲,有序的部署、擴展、刪除和滾動更新。
DaemonSet:
DaemonSet確保所有(或一些)節點運行同一個Pod。當節點加入kubernetes集羣中,Pod會被調度到該節點上運行,當節點從集羣中移除時,DaemonSet的Pod會被刪除。刪除DaemonSet會清理它所有創建的Pod。
Job:
一次性任務,運行完成後Pod銷燬,不再重新啓動新容器。還可以任務定時運行。

 

3、集羣部署提前規劃

#提前做好部署規劃,統一環境,避免日後挖坑。

system: CentOS-7-x86_64-Minimal-1804.iso
cpu: 2核2G
kubernetes:1.18
docker:yum
etcd:3.2.12
selinux: off
master01  192.168.192.128  etcd、kube-apiserver、kube-controller、kube-scheduler
node01    192.168.192.129  etcd、kubelet、kube-proxy、flannel、docker
node02    192.168.192.130  etcd、kubelet、kube-proxy、flannel、docker
•Kubernetes集羣組件:
  - etcd 一個高可用的K/V鍵值對存儲和服務發現系統
  - flannel 實現誇主機的容器網絡的通信
  - kube-apiserver 提供kubernetes集羣的API調用
  - kube-controller-manager 確保集羣服務
  - kube-scheduler 調度容器,分配到Node
  - kubelet 在Node節點上按照配置文件中定義的容器規格啓動容器
  - kube-proxy 提供網絡代理服務

具體k8s組件等說明參考官方文檔:http://docs.kubernetes.org.cn/230.html

 

4、node節點機器部署docker

#容器集羣管理當然要安裝docker了。

#兩臺節點機器部署docke

[root@linux-node1 yum.repos.d]# cd /etc/yum.repos.d/
[root@linux-node2 yum.repos.d]# yum install -y wget
[root@linux-node1 yum.repos.d]# wget https://download.docker.com/linux/centos/docker-ce.repo
[root@linux-node1 yum.repos.d]# yum install -y docker-ce
[root@linux-node1 yum.repos.d]# 
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://i723j6sh.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
sudo systemctl enable docker

 

5、master部署自籤TSL證書

#加密數據安全考慮,信息安全就是國家安全。

#列出組件需要使用的證書

etcd              ca.pem server.pem server-key.pem
flannel           ca.pem server.pem server-key.pem
kube-apiserver    ca.pem server.pem server-key.pem
kubelet           ca.pem ca-key.pem
kube-proxy        ca.pem kube-proxy.pem kube-proxy-key.pem
kubectl           ca.pem admin.pem admin-key.pem

#下載CFSSL
#CFSSL 包含一個命令行工具 和一個用於 簽名,驗證並且捆綁TLS證書的 HTTP API 服務。

[root@master01 ~]# mkdir ssl && cd ssl/
[root@master ssl]# wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64
[root@master ssl]# wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64
[root@master ssl]# wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64
[root@master ssl]# chmod +x cfssl*
[root@master ssl]# mv cfssl_linux-amd64 /usr/local/bin/cfssl
[root@master ssl]# mv cfssljson_linux-amd64 /usr/local/bin/cfssljson
[root@master ssl]# mv cfssl-certinfo_linux-amd64 /usr/bin/cfssl-certinfo
[root@master ssl]# cfssl --help 


#生成相關證書

#生成證書文件直接執行腳本,注意server-csr.json中ip:127.0.0.1,10.10.10.1不用修改,其他ip修改成自己節點ip即可。

#腳本內容爲每個所需證書或者私鑰文件進行配置和生成執行,也可單獨執行。

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": [
      "127.0.0.1",
      "192.168.192.128",
      "192.168.192.129",
      "192.168.192.130",
      "10.10.10.1",
      "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

 


#刪除其他文件只保留證書

[root@mangge01 ssl]# ls | grep -v pem | xargs -i rm {}
[root@mangge01 ssl]# ls
admin-key.pem  admin.pem  ca-key.pem  ca.pem  kube-proxy-key.pem  kube-proxy.pem  server-key.pem  server.pem


6、部署etcd集羣

#Etcd是Kubernetes集羣中的一個十分重要的組件,用於保存集羣所有的網絡配置和對象的狀態信息,包括各個組件的信息,各個節點的信息。
#flannel需要用到etcd存儲網絡的配置信息;kubernetes本身,包括各種對象的狀態和元信息配置

#創建集羣總目錄,三臺機器全部創建保持目錄規劃一致,每臺機器日後所有組件放一起,方便管理(軟件包、可執行二進制包、配置文件、證書)

[root@mangge01 ~]# mkdir -p /opt/kubernetes/{soft,bin,cfg,ssl}

#爲了方便集羣管理,配置ssh信任證書.可以直接免密碼登錄其他節點

[root@master ~]# ssh-keygen一直回車即可
[root@master ~]# ssh-keygen
[root@master ~]# ssh-copy-id [email protected]
[root@master ~]# ssh-copy-id [email protected]

#下載etcd包,規範數據目錄

[root@mangge01 ~]# cd /opt/kubernetes/soft/
[root@mangge01 soft]# wget https://github.com/coreos/etcd/releases/download/v3.2.12/etcd-v3.2.12-linux-amd64.tar.gz
[root@mangge01 soft]# tar zxvf etcd-v3.2.12-linux-amd64.tar.gz 
[root@mangge01 soft]# mv etcd-v3.2.12-linux-amd64/etcd /opt/kubernetes/bin/                        
[root@mangge01 soft]# mv etcd-v3.2.12-linux-amd64/etcdctl /opt/kubernetes/bin/
[root@mangge01 kubernetes]# cp -r /root/ssl/* /opt/kubernetes/ssl/

#創建etcd配置文件

[root@mangge01 kubernetes]# cat /opt/kubernetes/cfg/etcd
#[Member]
ETCD_NAME="etcd01"
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_PEER_URLS="https://192.168.192.128:2380"
ETCD_LISTEN_CLIENT_URLS="https://192.168.192.128:2379"

#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="https://192.168.192.128:2380"
ETCD_ADVERTISE_CLIENT_URLS="https://192.168.192.128:2379"
ETCD_INITIAL_CLUSTER="etcd01=https://192.168.192.128:2380,etcd02=https://192.168.192.129:2380,etcd03=https://192.168.192.130:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"

#創建etcd服務

[root@mangge01 kubernetes]# cat /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=-/opt/kubernetes/cfg/etcd
ExecStart=/opt/kubernetes/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} \
--initial-cluster-state=new \
--cert-file=/opt/kubernetes/ssl/server.pem \
--key-file=/opt/kubernetes/ssl/server-key.pem \
--peer-cert-file=/opt/kubernetes/ssl/server.pem \
--peer-key-file=/opt/kubernetes/ssl/server-key.pem \
--trusted-ca-file=/opt/kubernetes/ssl/ca.pem \
--peer-trusted-ca-file=/opt/kubernetes/ssl/ca.pem
Restart=on-failure
LimitNOFILE=65536

[Install]
WantedBy=multi-user.target
#此時,因爲兩node節點還沒配置etcd,啓動會卡死

#複製etcd相關文件到兩臺node節點,保證三臺主機etcd集羣配置一致,記得另外兩臺修改地址爲本地

[root@mangge01 member]# scp /usr/lib/systemd/system/etcd.service [email protected]:/usr/lib/systemd/system/   
[root@mangge01 member]# scp /usr/lib/systemd/system/etcd.service [email protected]:/usr/lib/systemd/system/
[root@mangge01 ~]# scp -r /opt/kubernetes/* [email protected]:/opt/kubernetes/
[root@mangge01 ~]# scp -r /opt/kubernetes/* [email protected]:/opt/kubernetes/
[root@node01 and 02 ~]#  vi /opt/kubernetes/cfg/etcd   
[root@linux-node3 ~]# cat /opt/kubernetes/cfg/etcd 
ETCD_NAME="etcd03"
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_PEER_URLS="https://192.168.192.130:2380"
ETCD_LISTEN_CLIENT_URLS="https://192.168.192.130:2379"
 
#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="https://192.168.192.130:2380"
ETCD_ADVERTISE_CLIENT_URLS="https://192.168.192.130:2379"
ETCD_INITIAL_CLUSTER="etcd01=https://192.168.192.128:2380,etcd02=https://192.168.192.129:2380,etcd03=https://192.168.192.130:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"

 

#三臺全部啓動etcd服務,查看進程,查看集羣狀態

[root@node02 ~]# systemctl start etcd
[root@node02 ~]# systemctl enable etcd 
如果啓動失敗請參考 https://www.cnblogs.com/dukuan/p/8671345.html
[root@node02 ~]# ps -ef | grep etcd
[root@k8s-master ~]# cd /opt/kubernetes/ssl/
[root@k8s-master ssl]# /opt/kubernetes/bin/etcdctl --ca-file=ca.pem --cert-file=server.pem --key-file=server-key.pem --endpoints="https://192.168.192.128:2379","https://192.168.192.129:2379","https://192.168.192.130:2379" cluster-health
member 2d24cb1c3287d501 is healthy: got healthy result from https://192.168.192.130:2379
member 3f8d6b7f4f1e8ec9 is healthy: got healthy result from https://192.168.192.128:2379
member e8b5dbd61bd08df6 is healthy: got healthy result from https://192.168.192.129:2379
cluster is healthy


 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章