Argo CD系列視頻圖文版之手把手教你搭建Argo CD 實驗環境

開篇

本期視頻,我們一起來手把手的搭建實驗環境。爲了節省資源,我們部署 All-In-One K8S環境,也就是所有 kubernetes 資源,運行在一臺服務器上。

視頻直達

第一部分視頻

第二部分視頻


安裝工具

開始動手之前,我們來介紹兩款工具,kubekeyk9s

kubeykeyKubeSphere 團隊基於 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. 創建集羣


創建集羣前,有三個點需要檢查:

  1. 禁用 selinux
  2. 禁用防火牆
  3. 安裝相關係統級依賴
# 臨時禁用 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

我們實驗中使用OpenLBlayer2模式。這種模式需要配置一些集羣主機網段的空地址,也就是說這些IP不能綁定物理網卡。OpenLB提供 Eip 這個CRD來配置這些空 IP。爲什麼需要這樣的 IP 呢?我們來簡單講解下 Layer2 模式的原理

當外部有流量請求某個空 IP時,路由器會發出ARP廣播報文,也就是到集羣服務器網段內詢問,數據要發給誰。顯然不會有任何一個主機響應,此時,OpenLBport-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 讓大家感受一下。

參考資料

[1]

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源創計劃”,歡迎正在閱讀的你也加入,一起分享。

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