官網:
https://kubernetes.io/
https://github.com/kubernetes/kubernetes
谷歌Borg,后經過Go語言重寫並捐獻給CNCF基金會開源
Kubernetes 舵手/飛行員
開源的容器編排框架工具(生態極其豐富)
Pod/Pod控制器
Pod
Pod控制器
Name/Namespace
Name
Namespace
Label/Label選擇器
Label
Label選擇器
Service/Ingress
Service
Ingress
kube-apiserver服務
controller-manager
scheduler
kubelet
kube-proxy
PS: k8s 三種網絡 及IP划分推薦
NODE 節點網絡(宿主機網絡) 10.x.x.0/24
POD 容器網絡 172.x.0.0/16
Service 集群網絡 192.168.x.x/16
IP規划每個ip號碼要有具體意義,便於排錯 POD和NODE 要近似:
例如:
10 段代表Node網絡
172 段代表Pod網絡
192 段代表 Service網絡
10.4.7.x/16 代表Node節點,4號機房下面的測試服務器,x號
10 = IDC的私有地址
4 = 機房區域(比如代表)
7 = 不同的項目,不同的環境(7測試,8預生產,9生產)
172.4.7.x/24 代表Pod節點,4號機房下面的測試服務器
K8S 邏輯架構圖 參考
K8S 集群架構圖
# 5台主機,1個VIP
10.4.7.10 VIP
10.4.7.200 運維主機
10.4.7.11 master
10.4.7.12 standby
10.4.7.21 主控節點、運算節點 核心組件
104.7.22 主控節點、運算節點 核心組件
K8S部署方式三種:
Minikube
# 直接Webshell 體驗
https://kubernetes.io/zh/docs/tutorials/hello-minikube/
二進制安裝部署
SSL 需要自簽發證書(自簽發證書:默認一年)
# 環境簡介
192.168.27.101
192.168.27.102
192.168.27.103
192.168.27.104
192.168.27.105
# 初始化設置
安裝和克隆虛擬機(略)
hostnamectl set-hostname <主機名>
調整yum源
yum install epel-release
關閉selinux和firewalld
setenforce 0
systemctl stop firewalld
必備工具安裝
yum install wget net-tools telnet tree nmap sysstat lrzsz dos2unix bind-utils ntpdate -y
ntpdate ntp1.aliyun.com # 把所有測試機時間同步
安裝DNS(bind)在 27.101
sudo yum install bind -y
主配置文件
vi /etc/named.conf
----------------修改內容--------------------
listen-on port 53 { 192.168.27.101; };
allow-query { any; };
dnssec-enable no;
dnssec-validation no;
-------------------增加內容-------------------
forwarders { 114.114.114.114; }; # 設置可用的DNS地址
# 檢查DNS配置文件設置是否成功
sudo named-checkconf # 沒有報錯表示成功
區域配置文件
/etc/named.rfc1912.zones
---------------增加內容------------------------
zone "host.com" IN {
type master;
file "host.com.zone";
allow-update { 192.168.27.11; };
};
zone "od.com" IN {
type master;
file "od.com.zone";
allow-update { 192.168.27.11; };
};
區域數據文件
/var/named/host.com.zone
---------------增加內容----------------------------
$ORIGIN host.com. $TTL 600 ; 10 minutes @ IN SOA dns.host.com. dnsadmin.host.com. ( 2020071001 ; serial 10800 ; refresh (3 hours) 900 ; retry (15 minutes) 604800 ; expire (1 week) 86400 ; minimum (1 day) ) NS dns.host.com. $TTL 60 ; 1 minute dns A 192.168.27.101 HDSS7-11 A 192.168.27.101 HDSS7-12 A 192.168.27.102 HDSS7-21 A 192.168.27.103 HDSS7-22 A 192.168.27.104 HDSS7-200 A 192.168.27.105
/var/named/od.com.zone
---------------增加內容----------------------------
$ORIGIN od.com. $TTL 600 ; 10 minutes @ IN SOA dns.host.com. dnsadmin.od.com. ( 2020071001 ; serial 10800 ; refresh (3 hours) 900 ; retry (15 minutes) 604800 ; expire (1 week) 86400 ; minimum (1 day) ) NS dns.od.com. $TTL 60 ; 1 minute dns A 192.168.27.101
再次效驗dns配置文件
named-checkconf
啟動DNS服務
systemctl start named
使用dig測試解析結果
dig -t A hdss7-21.host.com @192.168.27.101 +short
看到此結果表示dns生效,現在就把你本地的dns指向到這個DNS服務器
vim /etc/sysconfig/network-scripts/ifcfg-ensXXX
------------------修改配置文件---------------------
DNS1=192.168.27.101 # IP為你搭建的DNS服務器IP
Tips: 添加短域名解析
/etc/resolv.conf
# Generated by NetworkManager
search host.com # 一般僅用於主機域
nameserver 192.168.27.101
# 使用短域名進行ping 也是可以解析
把所有剩下的服務器全部主DNS修改為192.168.27.101
准備簽發證書環境
在運維主機上HDSS7-200(192.168.27.105)上:
CFSSL
是CloudFlare開源的一款PKI/TLS工具。 CFSSL 包含一個命令行工具 和一個用於 簽名,驗證並且捆綁TLS證書的 HTTP API 服務。 使用Go語言編寫。
Github 地址: https://github.com/cloudflare/cfssl
官網地址: https://pkg.cfssl.org/
安裝CFSSL
wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 -O /usr/bin/cfssl
wget https://pkg.cfssl.org/R1.1/cfssljson_linux-amd64 -O /usr/bin/cfssl-json
wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64 -O /usr/bin/cfss-certinfo
chmod +x /usr/bin/cfssl*
創建一個證書目錄
mkdir -p /opt/certs
sudo sh -c "cfssl print-defaults config > config.json" # 生成一個配置模板(這個步驟可以省略)
sudo sh -c " cfssl print-defaults csr > ca-csr.json" # 生成證書信息文件
創建文件 /opt/certs/ca-csr.json
-------------增加內容--------------------------
{ "CN": "Cdbaidu", "hosts": [ ], "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "CN", "L": "Chengdu", "ST": "Chengdu", "O": "od", "OU": "ops" } ], "ca": { "expiry": "175200h" # 20年 } }
簽發生產字簽證證書
cfssl gencert -initca ca-csr.json | sudo cfssl-json -bare ca
ca-csr.json # 上面編輯的文件名
ca 前綴
管道后面的是生產.pem文件
部署docker環境
HDSS7-200(192.168.27.105)
HDSS7-21(192.168.27.103)
HDSS7-22(192.168.27.104)
一條命令安裝Docker環境
sh -c "curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun"
查看docker版本
配置參數
sudo vim /etc/docker/daemon.json
{ "graph": "/data/docker", "storage-driver": "overlay2", "insecure-registries": ["registry.access.redhat.com","quay.io","harbor.od.com"], "registry-mirrors": ["https://q2gr04ke.mirror.aliyuncs.com"], "bip": "172.7.21.1/24", # 這里根據自己HDSS7-21,設置了172.7.21.1/24方便記憶和排錯 "exec-opts": ["native.cgroupdriver=systemd"], "live-restore": true }
sudo systemctl start docker # 啟動docker服務
檢查三台是否都已經成功配置docker引擎
docker version
部署docker私有鏡像倉庫
HDSS7-200(192.168.27.105)
下載完畢后進行解壓
tar xf harbor-offline-installer-v2.0.1.tgz -C /opt/
mv harbor harbor-v2.0.1 # 增加版本號備注
ln -s /opt/harbor-v2.0.1/ /opt/harbor # 創建軟鏈接便於以后升級
PS:harbor 依賴 docker-compose
yum install docker-compose -y
sudo mkdir -p /data/harbor/logs # 如果修改了日志存放目錄需要創建對應目錄
修改配置文件
cp /opt/harbor/harbor.yml.tmpl /opt/harbor/harbor.yml # 把模板文件變成正式的配置文件
----------------修改下面內容------------------------
http:
port: 180
hostname: harbor.od.com
harbor_admin_password: Harbor12345 # 生產環境自行修改
database:
password: root123 # 生產環境自行修改
data_volume:/data/harbor
location:/data/harbor/logs
開始執行harbor 腳本
/opt/harbor/install.sh
Note:遇到報錯
ERROR:root:Error: The protocol is https but attribute ssl_cert is not set
方法一: 可以在配置文件里面注釋掉和443相關部分
方法二:配置相關https的證書認證
https://www.cnblogs.com/Dev0ps/p/10566398.html
腳本執行成功,如下提示:
進行自檢,輸入 sudo docker-compose ps
看到harbor 給我們拉取和啟用的各種鏡像
安裝Nginx
yum install nginx -y
創建配置文件
/etc/nginx/conf.d/harbor.od.com.conf
------------新增如下內容------------
server { listen 80; server_name harbor.od.com; client_max_body_size 1000m; location / { proxy_pass http://127.0.0.1:180; } }
檢測nginx配置文件語法是否正常
sudo nginx -t
啟動nginx
systemctl start nginx
systemctl enable nginx
PS: 這里為了方便,需要在HDSS7-11(192.168.27.101)添加一條dns記錄.
vi /var/named/od.com.zone
-----------------修改和添加內容(見黃底紅字處)----------------------
$ORIGIN od.com. $TTL 600 ; 10 minutes @ IN SOA dns.host.com. dnsadmin.od.com. ( 2020071002 ; serial 注意前滾一個序號 10800 ; refresh (3 hours) 900 ; retry (15 minutes) 604800 ; expire (1 week) 86400 ; minimum (1 day) ) NS dns.od.com. $TTL 60 ; 1 minute dns A 192.168.27.101 harbor A 192.168.27.105
systemctl restart named
添加后進行測試,DNS是否成功
dig -t A harbor.od.com +short
使用客戶端訪問:
http://harbor.od.com:180/ # 看到如下界面
Harbor 頁面操作
賬號密碼登陸--新建項目
# 在HDSS7-200(192.168.27.105)下載一個公網鏡像
sudo docker pull nginx:1.7.9
docker tag <IMAGE ID > harbor.od.com/public/nginx:v.17.9 # 給公網鏡像打一個tag
docker push harbor.od.com/public/nginx:v1.7.9 # 嘗試推送到我們自己的私有倉庫
Note: 錯誤提示
unauthorized: unauthorized to access repository: public/nginx, action: push: unauthorized to access repository: public/nginx, action: push
原因是需要登陸你的私有倉庫,不然沒有授權網上傳。
docker login harbor.od.com
輸入你私有倉庫的賬號密碼,Push成功
部署Master節點服務
部署etcd集群
集群規划
HDSS7-12 角色:etcd lead 192.168.27.102
HDSS7-21 角色:etcd follow 192.168.27.103
HDSS7-22 角色:etcd follow 192.168.27.104
創建基於根證書的config配置文件
HDSS7-200(27.105)上 /opt/certs/
vim /opt/certs/ca-config.json
-----------------------新增以下內容------------------------------
1 { 2 "signing": { 3 "default": { 4 "expiry": "1725200h" 5 }, 6 "profiles": { 7 "server": { 8 "expiry": "1725200h", 9 "usages": [ 10 "signing", 11 "key encipherment", 12 "server auth" 13 ] 14 }, 15 "client": { 16 "expiry": "1725200h", 17 "usages": [ 18 "signing", 19 "key encipherment", 20 "client auth" 21 ] 22 }, 23 "peer": { 24 "expiry": "1725200h", 25 "usages": [ 26 "signing", 27 "key encipherment", 28 "server auth", 29 "client auth" 30 ] 31 } 32 } 33 } 34 }
創建etcd-peer-csr文件
vim etcd-peer-csr.json
------------新增以下內容-----------------------
1 { 2 "CN": "k8s-etcd", 3 "hosts": [ 4 "192.168.27.101", 5 "192.168.27.102", 6 "192.168.27.103", 7 "192.168.27.104" 8 ], 9 "key": { 10 "algo": "rsa", 11 "size": 2048 12 }, 13 "names": [ 14 { 15 "C": "CN", 16 "ST": "beijing", 17 "L": "beijing", 18 "O": "od", 19 "OU": "ops" 20 } 21 ] 22 }
簽發證書
依然保持/opt/crets目錄下(確保上面2個文件已經創建成功)
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=peer etcd-peer-csr.json
# 產生簽發證書文件
sudo cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=peer etcd-peer-csr.json | sudo cfssl-json -bare etcd-peer
回到節點:HDSS7-12(27.102)上
創建用戶
useradd -s /sbin/nologin -M etcd
-M 沒有家目錄
下載etcd的軟件
# 教程里面推薦不超過3.3.x的版本
tar zxvf etcd-v3.x.x-linux-amd64.tar.gz -C /opt
cd /opt
ln -s /opt/etcd-v3.x.x /opt/etcd
創建etcd的證書存放目錄
sudo mkdir -p /opt/etcd/certs /data/etcd /data/logs/etcd-server
# 拷貝上面生成的證書到/opt/etcd/certs 下面
給etcd目錄授權權限
chown -R etcd.etcd /opt/etcd-v3.1.20/
chown -R etcd.etcd /data/etcd
chown -R etcd.etcd /data/logs/etcd-server/
創建一個etcd的腳本
/opt/etcd/etcd-server-startup.sh
chmod +x /opt/etcd/etcd-server-startup.sh
-------------------添加如下內容--------------------------
1 #!/bin/sh 2 ./etcd --name etcd-server-7-12 \ 3 --data-dir /data/etcd/etcd-server \ 4 --listen-peer-urls https://192.168.27.102:2380 \ 5 --listen-client-urls https://192.168.27.102:2379,http://127.0.0.1:2379 \ 6 --quota-backend-bytes 8000000000 \ 7 --initial-advertise-peer-urls https://192.168.27.102:2380 \ 8 --advertise-client-urls https://192.168.27.102:2379,http://127.0.0.1:2379 \ 9 --initial-cluster etcd-server-7-12=https://192.168.27.102:2380,etcd-server-7-21=https://192.168.27.103:2380,etcd-server-7-22=https://192.168.27.104:2380 \ 10 --ca-file ./certs/ca.pem \ 11 --cert-file ./certs/etcd-peer.pem \ 12 --key-file ./certs/etcd-peer-key.pem \ 13 --client-cert-auth \ 14 --trusted-ca-file ./certs/ca.pem \ 15 --peer-ca-file ./certs/ca.pem \ 16 --peer-cert-file ./certs/etcd-peer.pem \ 17 --peer-key-file ./certs/etcd-peer-key.pem \ 18 --peer-client-cert-auth \ 19 --peer-trusted-ca-file ./certs/ca.pem \ 20 --log-output stdout
# 安裝一個輔助工具(用於讓腳本自動運行,如果腳本停止自動啟動)
yum install supervisor -y
systemctl start supervisord
systemctl enable supervisord
設置supervisor啟動設置文件
vim /etc/supervisord.d/etcd-server.ini
-------------------添加下面內容------------------------
1 [program: etcd-server-7-12] 2 command=/opt/etcd/etcd-server-startup.sh 3 numprocs=1 4 directory=/opt/etcd 5 autostart=true 6 autorestart=true 7 startsecs=30 8 startretries=3 9 exitcodes=0,2 10 stopsignal=QUIT 11 stopwaitsecs=10 12 user=etcd 13 redirect_stderr=true 14 stdout_logfile=/data/logs/etcd-server/etcd.stdout.1og 15 stdout_logfile_maxbytes=64MB 16 stdout_logfile_backups=4 17 stdout_capture_maxbytes=1MB 18 stdout_events_enabled=false
開始操作supervisor
supervisorctl update
supervisorctl status
# 查看啟動日志
tail -fn 200 /data/logs/etcd-server/etcd.stdout.1og
# 查看端口是否正常開啟
sudo netstat -luntp |grep etcd
PS:3個節點都按照上面配置,注意標黃部分自己需要修改。
檢查集群的健康狀態
進入任意節點目錄/opt/etcd/下,執行
./etcdctl cluster-health
./etcdctl member list # 通過這個命令可以查看到當前集群的leader
部署kube-apiserver集群
HDSS7-21(27.103)
HDSS7-22(27.104)
這里部署以HDSS7-21 為例,另外一台配置相同
v1.15.2 v1.18.5
tar xf kubernetes-server-linux-amd64-v1.18.5.tar.gz -C /opt
cd /opt
mv kubernetes-server-linux-amd64 kubernetes-v1.18.5
ln -s kubernetes-v1.18.5 kubernetes
清理二進制安裝無用包(可選)
/opt/kubernets/kubernetes-src.tar.gz # go語言源碼包
/opt/kubernetes/server/bin 下面所有tar包和_tag(docker鏡像)