目錄
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