目錄
一、部署步驟
二、部署kubernetes
2.1、所有節點關閉防火墻 核心防護 iptables規則 swap交換
2.2、修改主機名并添加主機映射
2.3、調整內核參數
三、安裝Docker
3.1、所有節點安裝docker
3.2、所有接點添加鏡像加速器
3.3、開啟docker、并設置開機自啟、查看狀態
四、安裝kubeadm,kubelet和kubectl
4.1、定義kubernetes源
4.2、安裝kubeadm,kubelet和kubectl
4.3、開機自啟kubelet
五、部署K8S集群
5.1、查看初始化需要的鏡像
5.2、初始化kubeadm
5.3、設定kubectl
5.4、所有節點部署網絡插件
5.5、在 node 節點上執行 kubeadm join 命令加入群集并查看狀態
5.6、測試pod創建資源
5.7、暴露端口提供服務
5.8、測試訪問
5.9、擴展3個副本
六、部署 Dashboard
6.1、上傳 相關yaml?文件到 /opt/k8s 目錄中
6.2、創建service account并綁定默認cluster-admin管理員集群角色
七、安裝Harbor私有倉庫
7.1、修改主機名,添加主機名和ip的映射
7.2、安裝Docker20版本
7.2.1 添加鏡像加速器
7.2.2 開啟docker并設為開機自啟
7.3、安裝harbor
7.3.1 準備docker-compose安裝包
7.3.2 準備harbor私有倉庫的安裝包
7.3.3?生成證書、私鑰
7.3.4 啟動Harbor
7.3.5 瀏覽器訪問
7.3.6?在一個node節點上登錄harbor
7.3.7 登錄Harbar上傳鏡像
7.4、安裝ipvsadm
7.4.1?修改調度策略,再去訪問
7.5、瀏覽器訪問
7.6、內核參數優化方案
一、部署步驟
- 在所有節點上安裝Docker和kubeadm
- 部署Kubernetes Master
- 部署容器網絡插件
- 部署 Kubernetes Node,將節點加入Kubernetes集群中
- 部署 Dashboard Web 頁面,可視化查看Kubernetes資源
- 部署 Harbor 私有倉庫,存放鏡像資源
二、部署kubernetes
實驗環境
服務器 | IP地址 | 主要組件 |
---|---|---|
master | 192.168.10.100 | docker / kubeadm / kubelet / kubectl / flannel |
node01 | 192.168.10.101 | docker/kubeadm/kubelet/kubectl/flannel |
node02 | 192.168.10.102 | docker/kubeadm/kubelet/kubectl/flanne |
harbor | 192.168.10.103 | docker、docker-compose、harbor-offline-v1.2.2 |
2.1、所有節點關閉防火墻 核心防護 iptables規則 swap交換
以下圖片只展示一個,過程都一樣
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
sed -i 's/enforcing/disabled/' /etc/selinux/config
iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X
swapoff -a ##交換分區必須要關閉
sed -ri 's/.*swap.*/#&/' /etc/fstab ##永久關閉swap分區,&符號在sed命令中代表上次匹配的結果
for i in $(ls /usr/lib/modules/$(uname -r)/kernel/net/netfilter/ipvs|grep -o "^[^.]*");do echo $i; /sbin/modinfo -F filename $i >/dev/null 2>&1 && /sbin/modprobe $i;done ##加載模塊
2.2、修改主機名并添加主機映射
hostnamectl set-hostname master01
bash
hostnamectl set-hostname node01
bash
hostnamectl set-hostname node02
bashecho "192.168.10.100 master01" >> /etc/hosts
echo "192.168.10.101 node01" >> /etc/hosts
echo "192.168.10.102 node02" >> /etc/hosts
echo "192.168.10.103 hub.hg.com" >> /etc/hosts
cat /etc/hosts
2.3、調整內核參數
cat > /etc/sysctl.d/kubernetes.conf << EOF
#開啟網橋模式,可將網橋的流量傳遞給iptables鏈
net.bridge.bridge-nf-call-ip6tables=1
net.bridge.bridge-nf-call-iptables=1
#關閉ipv6協議
net.ipv6.conf.all.disable_ipv6=1
net.ipv4.ip_forward=1
EOF//生效參數
sysctl --system
三、安裝Docker
3.1、所有節點安裝docker
[root@master01 ~]#yum install -y yum-utils device-mapper-persistent-data lvm2
[root@master01 ~]#yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
[root@master01 ~]#yum install -y docker-ce docker-ce-cli containerd.io
[root@master01 ~]#mkdir /etc/docker/
[root@master01 ~]#cat > /etc/docker/daemon.json <<EOF{"registry-mirrors": ["https://6ijb8ubo.mirror.aliyuncs.com"],"exec-opts": ["native.cgroupdriver=systemd"],"log-driver": "json-file","log-opts": {"max-size": "100m"}}
EOF
[root@master01 ~]#systemctl daemon-reload
[root@master01 ~]#systemctl restart docker.service
[root@master01 ~]#systemctl enable docker.service
3.2、所有接點添加鏡像加速器
cat > /etc/docker/daemon.json <<EOF
{"registry-mirrors": ["https://6ijb8ubo.mirror.aliyuncs.com"],"exec-opts": ["native.cgroupdriver=systemd"],"log-driver": "json-file","log-opts": {"max-size": "100m"}
}
EOF
#使用Systemd管理的Cgroup來進行資源控制與管理,因為相對Cgroupfs而言,Systemd限制CPU、內存等資源更加簡單和成熟穩定。
#日志使用json-file格式類型存儲,大小為100M,保存在/var/log/containers目錄下,方便ELK等日志系統收集和管理日志。
3.3、開啟docker、并設置開機自啟、查看狀態
systemctl daemon-reload
systemctl restart docker.service
systemctl enable docker.service
systemctl status docker.servicedocker info | grep "Cgroup Driver"
Cgroup Driver: systemd ##結果
四、安裝kubeadm,kubelet和kubectl
所有節點安裝
4.1、定義kubernetes源
cat > /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
4.2、安裝kubeadm,kubelet和kubectl
yum install -y kubelet-1.20.11 kubeadm-1.20.11 kubectl-1.20.11
4.3、開機自啟kubelet
systemctl enable kubelet.service
五、部署K8S集群
5.1、查看初始化需要的鏡像
[root@master01 ~]#kubeadm config images list
[root@master01 opt]#unzip v1.20.11.zip -d /opt/k8s/
[root@master01 opt]#cd /opt/k8s/v1.20.11/
[root@master01 v1.20.11]#for i in $(ls *.tar); do docker load -i $i; done
#復制鏡像和腳本到 node 節點,并在 node 節點上執行腳本加載鏡像文件
[root@master01 v1.20.11]#scp -r /opt/k8s/ root@192.168.10.132:/opt/
[root@master01 v1.20.11]#scp -r /opt/k8s/ root@192.168.10.133:/opt/
[root@node01 v1.20.11]# for i in $(ls *.tar); do docker load -i $i; done
[root@node02 v1.20.11]# for i in $(ls *.tar); do docker load -i $i; done
5.2、初始化kubeadm
kubeadm config print init-defaults > /opt/kubeadm-config.yamlvim kubeadm-config.yamladvertiseAddress: 192.168.10.100 ## 12行
kubernetesVersion: v1.20.11 ## 34行
podSubnet: 10.244.0.0/16 ## 37行
serviceSubnet: 10.96.0.0/16 ## 38行
--- ## 40行
apiVersion: kubeproxy.config.k8s.io/v1alpha1 ## 41行
kind: KubeProxyConfiguration ## 42行
mode: ipvs ## 43行kubeadm init --config=kubeadm-config.yaml --upload-certs | tee kubeadm-init.log
#--experimental-upload-certs 參數可以在后續執行加入節點時自動分發證書文件,K8S V1.16版本開始替換為 --upload-certs
#tee kubeadm-init.log 用以輸出日志
//查看 kubeadm-init 日志
less kubeadm-init.log//kubernetes配置文件目錄
ls /etc/kubernetes///存放ca等證書和密碼的目錄
ls /etc/kubernetes/pki
5.3、設定kubectl
kubectl需經由API server認證及授權后方能執行相應的管理操作,kubeadm 部署的集群為其生成了一個具有管理員權限的認證配置文件 /etc/kubernetes/admin.conf,它可由 kubectl 通過默認的 “$HOME/.kube/config” 的路徑進行加載。
[root@master01 opt]#mkdir -p $HOME/.kube
[root@master01 opt]#cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@master01 opt]#chown $(id -u):$(id -g) $HOME/.kube/config
[root@master01 opt]#kubectl get node
[root@master01 opt]#kubectl get cs
#如果 kubectl get cs 發現集群不健康,更改以下兩個文件
[root@master01 opt]#vim /etc/kubernetes/manifests/kube-scheduler.yaml
[root@master01 opt]#vim /etc/kubernetes/manifests/kube-controller-manager.yaml
把httpGet:字段下的hosts由127.0.0.1變成192.168.10.100(有兩處)
#- --port=0 # 搜索port=0,把這一行注釋掉
host: 192.168.10.100 ##修改地址
[root@master01 opt]#systemctl restart kubelet.service
[root@master01 opt]#kubectl get cs
[root@master01 opt]#kubectl get node
[root@master01 opt]#vim /etc/kubernetes/manifests/kube-scheduler.yaml- --bind-address=192.168.10.100 ## 第16行
# - --port=0 ## 第19行
host: 192.168.10.100 ## 第25行
host: 192.168.10.100 ## 第39行
[root@master01 opt]#vim /etc/kubernetes/manifests/kube-scheduler.yaml- --bind-address=192.168.10.100 ## 第17行
# - --port=0 ## 第26行
host: 192.168.10.100 ## 第37行
host: 192.168.10.100 ## 第51行
5.4、所有節點部署網絡插件
cd /opt
unzip kuadmin.zip ##上傳所需要的壓縮包
解壓
unzip kuadmin.zip
scp flannel-cni-v1.2.0.tar flannel-v0.22.2.tar node01:/opt/ ##拷貝到node01
scp flannel-cni-v1.2.0.tar flannel-v0.22.2.tar node01:/opt/ ##拷貝到node02
[root@master01 opt]#docker load -i flannel-cni-v1.2.0.tar
[root@master01 opt]#docker load -i flannel-v0.22.2.tar
[root@master01 opt]#docker images
[root@master01 opt]#kubectl apply -f kube-flannel.yml
[root@master01 opt]#kubectl get node
5.5、在 node 節點上執行 kubeadm join 命令加入群集并查看狀態
將node節點加進來,
[root@master01 opt]#ls
[root@master01 opt]#cat kubeadm-init.log##node01和node02上面添加
kubeadm join 192.168.10.100:6443 --token abcdef.0123456789abcdef \--discovery-token-ca-cert-hash sha256:3800375b6db6fe668a7812e883ff1dc7ecc405c5ead58d289a6f015b594d1205##master01查看
[root@master01 opt]#kubectl get node
[root@master01 opt]#kubectl get cs
[root@master01 opt]#kubectl get pods -n kube-system
[root@master01 opt]#kubectl get pod -n kube-flannel
[root@master01 opt]#kubectl get pod -n kube-flannel -owide
由于機器的原因,換了三臺,和之前位置相似?
5.6、測試pod創建資源
kubectl create deployment nginx --image=nginx ##拉取nginx
[root@master01 opt]#kubectl get pod ##看是否拉取到
[root@master01 opt]#kubectl get pod -owide ##查看詳細信息[root@master01 opt]#curl 10.244.2.2 ##只能對內訪問,不能訪問
5.7、暴露端口提供服務
[root@master01 opt]#kubectl expose deployment nginx --port=80 --type=NodePort
[root@master01 opt]#kubectl get svc
5.8、測試訪問
192.168.10.103:31606
192.168.10.104:31606
5.9、擴展3個副本
[root@master01 opt]#kubectl scale deployment nginx --replicas=3
[root@master01 opt]#kubectl get pods -o wide
六、部署 Dashboard
6.1、上傳 相關yaml?文件到 /opt/k8s 目錄中
在 master01 節點上操作
在 master01 節點上操作
#上傳 recommended.yaml 文件到 /opt/k8s 目錄中
cd /opt/k8s
vim recommended.yaml
#默認Dashboard只能集群內部訪問,修改Service為NodePort類型,暴露到外部:
kind: Service
apiVersion: v1
metadata:labels:k8s-app: kubernetes-dashboardname: kubernetes-dashboardnamespace: kubernetes-dashboard
spec:ports:- port: 443targetPort: 8443nodePort: 30001 #添加type: NodePort #添加selector:k8s-app: kubernetes-dashboard##上傳dashboard.tar metrics-scraper.tar到/opt目錄下##遠程從master拷貝到node節點的/opt下
[root@master01 opt]#scp dashboard.tar metrics-scraper.tar node01:/opt/##master節點執行下面語句
kubectl apply -f recommended.yaml#使用輸出的token登錄Dashboard
https://NodeIP:30001
6.2、創建service account并綁定默認cluster-admin管理員集群角色
#創建service account并綁定默認cluster-admin管理員集群角色
kubectl create serviceaccount dashboard-admin -n kube-system
kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin
kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}')
6.3、登錄Dashboard
#使用輸出的token登錄Dashboard
https://NodeIP:30001無論哪個node的IP地址、因為服務都是運行在node上的
https://192.168.10.104:30001
?
七、安裝Harbor私有倉庫
7.1、修改主機名,添加主機名和ip的映射
#修改主機名
hostnamectl set-hostname hub.hg.com#所有節點加上主機名映射
echo "192.168.10.103 master01" >> /etc/hosts
echo "192.168.10.104 node01" >> /etc/hosts
echo "192.168.10.105 node02" >> /etc/hosts
echo "192.168.10.106 hub.hg.com" >> /etc/hosts
cat /etc/hosts
7.2、安裝Docker20版本
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum install -y docker-ce-20.10.18 docker-ce-cli-20.10.18 containerd.iomkdir /etc/docker
cat > /etc/docker/daemon.json <<EOF
{"registry-mirrors": ["https://6ijb8ubo.mirror.aliyuncs.com"],"exec-opts": ["native.cgroupdriver=systemd"],"log-driver": "json-file","log-opts": {"max-size": "100m"},"insecure-registries": ["https://hub.hg.com"]
}
EOFsystemctl start docker
systemctl enable docker
7.2.1 添加鏡像加速器
所有節點都需要修改
vim /etc/docker/daemon.json{"registry-mirrors": ["https://6ijb8ubo.mirror.aliyuncs.com"],"exec-opts": ["native.cgroupdriver=systemd"],"log-driver": "json-file","log-opts": {"max-size": "100m"},"insecure-registries": ["https://hub.hg.com"]
}
7.2.2 開啟docker并設為開機自啟
##首先加載一下,因為前面把每個節點都配置了鏡像加速器
systemctl daemon-reload
systemctl restart docker.service
systemctl enable docker.service
systemctl status docker.service
##此處就顯示一個界面,其他節點的不展示了
7.3、安裝harbor
7.3.1 準備docker-compose安裝包
[root@hub ~]#cd /usr/local/bin/
##上傳docker-compose ##直接將docker-compose上傳到/usr/local/bin/
docker-compose
[root@hub bin]#chmod +x docker-compose ##添加執行權限
7.3.2 準備harbor私有倉庫的安裝包
官網下載地址:http://harbor.orientsoft.cn/harbor-1.2.2/harbor-offline-installer-v1.2.2.tgz
##首先進入/opt,然后將下載好的harbor壓縮包上傳到/opt
##進行解壓
[root@hub opt]#tar xf harbor-offline-installer-v1.2.2.tgz
##將harbor配置文件進行備份
[root@hub harbor]#cp harbor.cfg{,.bak}
##對harbor.cfg配置文件進行修改
[root@hub harbor]#vim harbor.cfg
hostname = reg.hg.com ##第5行
ui_url_protocol = https ##第9行
db_password = root123 ##第12行
ssl_cert_key = /data/cert/server.key ##第25行
harbor_admin_password = Harbor12345 ##第59行
7.3.3?生成證書、私鑰
生成證書
make -p /data/cert
cd /data/cert
#生成私鑰
openssl genrsa -des3 -out server.key 2048
##密碼:123456
-------------------------------------------------------------------------------------------
openssl #這是一個強大的加密庫和工具集,用于處理SSL/TLS協議和相關的加密操作。
genrsa #openssl的子命令,用于生成 RSA 私鑰。
-des3 #openssl 使用 DES3算法來加密生成的私鑰。
-out server.key #這個選項指定了輸出文件的名稱,即生成的私鑰將被保存在名為server.key的文件中。
2048 #這個數字指定了RSA密鑰的長度(以位為單位)。
#生成證書簽名請求文件
openssl req -new -key server.key -out server.csr
=========================================================================================
req #用于處理與證書簽名請求(CSR)和私鑰相關的任務。
-new #這個選項指示OpenSSL創建一個新的證書簽名請求。
-key server.key #指定用于生成CSR的私鑰文件的路徑
-out server.csr #指定生成的CSR文件的輸出路徑。
=========================================================================================
-----------------------------------------------------------------------------------------
輸入私鑰密碼:123456
輸入國家名:CN
輸入省名:BJ
輸入市名:BJ
輸入組織名:HG
輸入機構名:HG
輸入域名:hub.hg.com
輸入管理員郵箱:admin@hg.com
其它全部直接回車
-----------------------------------------------------------------------------------------
#備份私鑰
cp server.key server.key.org#清除私鑰密碼
openssl rsa -in server.key.org -out server.key
輸入私鑰密碼:123456#簽名證書
openssl x509 -req -days 1000 -in server.csr -signkey server.key -out server.crtchmod +x /data/cert/*cd /opt/harbor/
./install.sh
備份私鑰
cp server.key server.key.org
清除私鑰密碼
openssl rsa -in server.key.org -out server.key
簽名證書
openssl x509 -req -days 1000 -in server.csr -signkey server.key -out server.crt
===========================================================================================
openssl x509 #這是OpenSSL的一個子命令,用于處理X.509證書。
-req #指示OpenSSL從一個CSR文件中讀取請求信息。
-days 1000 #設置證書的有效期為1000天。這意味著證書將在 1000 天后過期。
-in server.csr #指定CSR文件的輸入路徑
-signkey server.key #使用指定的私鑰(server.key)對CSR進行簽名,生成證書。
-out server.crt #指定輸出的證書文件路徑。在這個例子中,證書文件將被保存為server.crt
===========================================================================================chmod +x /data/cert/*
7.3.4 啟動Harbor
[root@hub cert]#cd /opt/harbor/
[root@hub harbor]#./install.sh
#執行命令 ./install.sh 以 pull 鏡像并啟動容器#運行./install.sh時,這個腳本會執行一系列的步驟來配置和啟動Harbor服務。這些步驟可能包括:
#檢查和準備安裝環境(如檢查必要的依賴項、配置文件等)。
#生成或驗證 Harbor 的配置文件(通常是 harbor.yml)。
#創建必要的數據目錄和文件。
#初始化數據庫(如果使用了數據庫存儲)。
#啟動 Harbor 的各個組件(如 core、registry、portal、jobservice 等)
7.3.5 瀏覽器訪問
添加主機映射
在本地使用火狐瀏覽器訪問:https://hub.hg.com
點擊高級--->添加例外---->確認安全例外用戶密碼登錄,默認為:用戶名:admin
密碼:Harbor12345
7.3.6?在一個node節點上登錄harbor
docker login -u admin -p Harbor12345 https://hub.hg.com
7.3.7 登錄Harbar上傳鏡像
在node01節點操作
?##上傳鏡像
docker tag nginx:latest hub.hg.com/library/nginx:v1
docker push hub.hg.com/library/nginx:v1
在master節點上刪除之前創建的nginx資源
kubectl delete deployment nginx
kubectl create deployment nginx-deployment --image=hub.hg.com/library/nginx:v1 --port=80 --replicas=3
kubectl expose deployment nginx-deployment --port=30000 --target-port=80
kubectl get svc,pods
kubectl get svc,pods -owide
訪問驗證
curl 10.244.1.7
7.4、安裝ipvsadm
[root@master01 k8s]#yum -y install ipvsadm.x86_64
[root@master01 k8s]#ipvsadm -Ln
[root@master01 k8s]#curl 10.96.30.170:30000
7.4.1?修改調度策略,再去訪問
kubectl edit svc nginx-deployment
25 type: NodePort #把調度策略改成NodePort[root@master01 k8s]#kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 2d3h
nginx NodePort 10.96.169.156 <none> 80:31606/TCP 2d3h
nginx-deployment NodePort 10.96.30.170 <none> 30000:31973/TCP 10h
[root@master01 k8s]#
7.5、瀏覽器訪問
瀏覽器訪問:http://192.168.10.103:31973/
http://192.168.10.104:31973/
http://192.168.10.105:31973/
#將cluster-admin角色權限授予用戶system:anonymous
kubectl create clusterrolebinding cluster-system-anonymous --clusterrole=cluster-admin --user=system:anonymous
7.6、內核參數優化方案
cat > /etc/sysctl.d/kubernetes.conf <<EOF
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
net.ipv4.ip_forward=1
net.ipv4.tcp_tw_recycle=0
vm.swappiness=0 #禁止使用 swap 空間,只有當系統內存不足(OOM)時才允許使用它
vm.overcommit_memory=1 #不檢查物理內存是否夠用
vm.panic_on_oom=0 #開啟 OOM
fs.inotify.max_user_instances=8192
fs.inotify.max_user_watches=1048576
fs.file-max=52706963 #指定最大文件句柄數
fs.nr_open=52706963 #僅4.4以上版本支持
net.ipv6.conf.all.disable_ipv6=1
net.netfilter.nf_conntrack_max=2310720
EOF