開篇
本期視頻,我們一起來手把手的搭建實驗環境。爲了節省資源,我們部署 All-In-One K8S環境,也就是所有 kubernetes 資源,運行在一臺服務器上。
視頻直達
第一部分視頻
第二部分視頻
安裝工具
開始動手之前,我們來介紹兩款工具,kubekey 和 k9s。
“kubeykey 是 KubeSphere 團隊基於 GoLang 語言開發的kubernetes集羣部署工具,使用 KubeKey,您可以輕鬆、高效、靈活地單獨安裝和管理 Kubernetes,當然如果你部署 Kubesphere 也是非常方便的。
”
“k9s是一款命令行下的 k8s 集羣管理工具,可以非常有效地提高你對 k8s的管理效率。本次分享我們對k8s 資源的觀察和操作,就是通過 k9s來實現的。
”
1. 安裝 kubekey
kubekey release[1]
cd $HOME/kubekey
# 下載最新穩定版
wget https://github.com/kubesphere/kubekey/releases/download/v1.1.1/kubekey-v1.1.1-linux-amd64.tar.gz
# 解壓縮
tar zxvf kubekey-v1.1.1-linux-amd64.tar.gz
# 刪除說明文檔
rm -rf README.md README_zh-CN.md kubekey-v1.1.1-linux-amd64.tar.gz
2.安裝 k9s
k9s release[2]
cd $HOME
# 下載最新穩定版
wget https://github.com/derailed/k9s/releases/download/v0.24.15/k9s_Linux_x86_64.tar.gz
# 解壓縮
tar zxvf k9s_Linux_x86_64.tar.gz
# 刪除多餘文件
rm -rf LICENSE README.md k9s_Linux_x86_64.tar.gz
部署k8s 環境
1. 生成 kubekey 配置
“kubekey 通過 KKZONE 這個環境變量,來決定使用哪些容器鏡像倉庫,從而提高鏡像資源的下載效率。
”
cd $HOME/kubekey
export KKZONE=cn
# 創建集羣配置,集羣名稱爲 monday
./kk create config --name monday
2. 修改配置
# 修改配置如下
apiVersion: kubekey.kubesphere.io/v1alpha1
kind: Cluster
metadata:
name: monday
spec:
hosts:
- {name: tm-opsinit-01, address: 10.10.14.99, internalAddress: 10.10.14.99}
roleGroups:
etcd:
- tm-opsinit-01
master:
- tm-opsinit-01
worker:
- tm-opsinit-01
controlPlaneEndpoint:
domain: monday-api.automan.fun
address: ""
port: 6443
kubernetes:
version: v1.19.8
imageRepo: kubesphere
clusterName: cluster.local
network:
plugin: calico
kubePodsCIDR: 10.233.64.0/18
kubeServiceCIDR: 10.233.0.0/18
registry:
registryMirrors: []
insecureRegistries: []
addons: []
3. 修改 docker 配置
“”
docker daemon
默認創建的docker0
網橋,使用172.17.0.0
網段地址,如果你的服務器使用的172.17.0.0
的網段,可以通過修改docker daemon
的配置來修改docker0
網橋的地址段,避免地址衝突。
# /etc/docker/daemon.json
{
"log-opts": {
"max-size": "5m",
"max-file":"3"
},
"exec-opts": ["native.cgroupdriver=systemd"],
"bip":"192.168.0.1/24"
}
修改完配置後,如果服務器上已安裝docker
服務,執行如下命令重載配置。如無運行docker
服務,請忽略。
systemctl daemon-reload && systemctl restart docker
4. 創建集羣
“創建集羣前,有三個點需要檢查:
”
-
禁用 selinux
-
禁用防火牆 -
安裝相關係統級依賴
# 臨時禁用 selinux
setenforce 0
sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
# 禁用防火牆
systemctl disable firewalld && systemctl stop firewalld && systemctl status firewalld
# 安裝系統依賴
yum install socat conntrack ebtables ipset
# 創建集羣
./kk create cluster -f config-monday.yaml
5. 安裝客戶端
“k8s 集羣部署好後,我們來安裝相關
”kubectl
管理工具。
# 添加 k8s yum 源
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
# 安裝 kubectl
yum install -y kubectl
# k8s 命令行參數很多,可以通過 bash-completion 來自動補全命令
# 命令行代碼補全
yum install bash-completion -y
echo "source <(kubectl completion bash)" >> ~/.bashrc
source ~/.bashrc
部署 OpenELB
集羣中的應用,如果要在集羣外部訪問,可以採用NodePort 方式暴露服務,也可以採用 LoadBalancer 的方式。爲了更好的模擬生產環境,咱們使用 LoadBalancer 的方式暴露服務。OpenELB
是由 Kubesphere 團隊開發的支持裸金屬服務器提供LoadBalancer
類型服務的工具。具體功能細節就不額外講解,大家可以自行參考官方文檔。國人主導開發的工具,中文支持非常好。
Github: https://github.com/kubesphere/openelb
# 一條命令安裝 porter
kubectl apply -f https://raw.githubusercontent.com/kubesphere/porter/master/deploy/porter.yaml
我們實驗中使用OpenLB
的layer2
模式。這種模式需要配置一些集羣主機網段的空地址,也就是說這些IP
不能綁定物理網卡。OpenLB
提供 Eip
這個CRD
來配置這些空 IP
。爲什麼需要這樣的 IP
呢?我們來簡單講解下 Layer2 模式的原理。
“當外部有流量請求某個空
”IP
時,路由器會發出ARP
廣播報文,也就是到集羣服務器網段內詢問,數據要發給誰。顯然不會有任何一個主機響應,此時,OpenLB
的port-manager
就會相應這個 ARP 報文。通過這種ARP
報文欺騙的黑客手段,實現流量的劫持。剩下的步驟,就由PortLB
來轉發流量到相應的Service
中。
PortLB 的 Layer2 模式,就是這樣工作的。
apiVersion: network.kubesphere.io/v1alpha2
kind: Eip
metadata:
name: eip-pool
spec:
address: 10.10.14.91-10.10.14.92
protocol: layer2
interface: ens192
disable: false
# 10.10.14.87-10.10.14.88
部署 nginx-ingress
“”
OpenLB
可以方便地暴露4 層協議
,比如TCP
協議等等,但在7 層協議
中的一些操作,就無能爲力啦,比如卸載 https 證書
,路由分發
等等。
nginx-ingress install guide[3]
# 1. 應用配置清單
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.0.0/deploy/static/provider/cloud/deploy.yaml
# 2. 修改 service 類型爲 LoadBalancer
# 3. service.metadata.annotations 中指定 OpenELB 配置
lb.kubesphere.io/v1alpha1: porter
protocol.porter.kubesphere.io/v1alpha1: layer2
# PortLB 就是通過這兩條 annotation 信息來識別要提供服務的 Service 的
openEBS
Kubernates
集羣中,對於有狀態應用,需要申請PV
支持。openEBS
支持把節點主機的文件系統映射爲存儲服務,這對我們的 All In One 實驗
來說,是個非常好的支持。
安裝 helm
“OpenEBS 官方支持 helm 安裝,所以我們首先安裝 helm 命令行工具。
”
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
echo 'PATH=$PATH:/usr/local/bin' >> ~/.bashrc && source ~/.bashrc
安裝 openebs
helm repo add openebs https://openebs.github.io/charts
helm repo update
helm install openebs --namespace openebs openebs/openebs --create-namespace
驗證 hostpath
# /var/openebs/local
kubectl apply -f https://openebs.github.io/charts/examples/local-hostpath/local-hostpath-pvc.yaml
kubectl apply -f https://openebs.github.io/charts/examples/local-hostpath/local-hostpath-pod.yaml
安裝 metric server
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
# bx509: cannot validate certificate for because it doesn't contain any IP SANs"
# metric server deployment args
# 添加
# - --kubelet-insecure-tls
總結
“到這裏,我們的實驗環境就搭建完成啦;涉及到的知識點非常多,因爲搭建集羣並非我們課程的主要內容,就不繼續給大家擴展知識了。如果有疑問或者遇到什麼問題,可以留言或到我們的社區羣衆交流羣中,一起探討。
”
給大家留個作業:再找一臺服務器,按照本節課的步驟,部署另外一套 kubernates
集羣,集羣名叫 tuesday
。後面咱們實驗多集羣管理時,會用到。
“下期視頻,我們將部署 ArgoCD 並且跑個官方 demo 讓大家感受一下。
”
參考資料
kubekey release: https://github.com/kubesphere/kubekey/releases
[2]k9s release: https://github.com/derailed/k9s/releases
[3]nginx-ingress install guide: https://kubernetes.github.io/ingress-nginx/deploy/
本文分享自微信公衆號 - Jenkins(Jenkins-Community)。
如有侵權,請聯繫 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。