多K8S集群運(yùn)維管理參考

環(huán)境

  1. K8S集群
    1. 集群一: k8s-admin 集群訪問(wèn)憑證保存為 ~/kubeconfig-k8s-admin
    2. 集群二: k8s-cube 集群訪問(wèn)憑證保存為 ~/kubeconfig-k8s-cube
  2. OPS主機(jī)需要軟件列表:helm痒玩,kubectl晕拆,ansible
    1. MacOS系統(tǒng):
brew install helm kubectl ansible 
cat >> ~/.zshrc << EOF
export PATH="/opt/homebrew/opt/ansible/:$PATH"
export PATH="/opt/homebrew/opt/helm/bin/:$PATH"
export PATH="/opt/homebrew/opt/kubectl/bin/:$PATH"
EOF
source ~/.zshrc

方式一:使用多個(gè) kubeconfig 文件來(lái)管理多集群

可以通過(guò)--kubeconfig 命令行參數(shù)來(lái)選擇操作不同集群

kubectl --kubeconfig ~/kubeconfig-k8s-admin get ns
kubectl --kubeconfig ~/kubeconfig-k8s-cube get ns
helm --kubeconfig ~/kubeconfig-k8s-admin list -A
helm --kubeconfig ~/kubeconfig-k8s-cube list -A

方式二:使用單一 kubeconfig 文件來(lái)管理多集群

使用默認(rèn)的 kubeconfig 文件, 需要將多個(gè) kubeconfig 合并,保存在kubeconfig 的默認(rèn)位置$HOME/.kube/config, 合并后的參考格式如下:

apiVersion: v1
kind: Config
preferences: {}

clusters:
- name: cluster-a
  cluster:
    certificate-authority-data: <cluster-a-token>
    server: https://cluster-a-api-lb:6443 
- name: cluster-b
  cluster:
    certificate-authority-data: <cluster-b-token>
    server: https://cluster-b-api-lb:6443 

users:
- name: cluster-a-user
  user:
    token: < cluster-a-user-token > 
- name: cluster-b-user
  user:
    token: < cluster-b-user-token > 

contexts:
- name: cluster-a-context 
  context:
      cluster: cluster-a
    user: cluster-a-user
- name: cluster-b-context
  context:
    cluster: cluster-b
    user: cluster-b-user

current-context: cluster-a-context

kubeconfig 中定義了 (clusters)集群坤溃、(users)用戶和 以及相關(guān)聯(lián)的(contexts)上下文甲雅,如果使用Uk8s 可以在控制臺(tái): 概覽-> 內(nèi)網(wǎng)憑證/外網(wǎng)憑證 查看需要的憑證昨稼,然后按照上述格式補(bǔ)全即可

  1. 在執(zhí)行kubectl 命令時(shí)需要執(zhí)行 --context 命令行參數(shù), 來(lái)選擇操作不同集群

  2. 在執(zhí)行helm 命令時(shí)需要執(zhí)行 --kube-context 命令行參數(shù), 來(lái)選擇操作不同集群

  3. 在執(zhí)行kubectl helm 命令不指定參數(shù)瞒瘸,則選則文件中的current-context作為默認(rèn)集群

kubectl get pods -A           #操作的是 current-context 定義的集群
kubectl get pods -A --context cluster-a-context #操作的是 cluster-a 集群
kubectl get pods -A --context cluster-b-context #操作的是 cluster-b 集群
helm list -A --kube-context cluster-a-context   #操作的是 cluster-a 集群
helm list -A --kube-context cluster-b-context   #操作的是 cluster-b 集群

方式三:使用ansible Playbook 來(lái)管理集群內(nèi)的容器應(yīng)用

sudo ansible-galaxy collection install kubernetes.core
sudo pip3 install kubernetes

場(chǎng)景描述: 目前我們需要使用helm安裝一個(gè)external-dns 用來(lái)將 ingess對(duì)接的域名解析規(guī)則,自動(dòng)同步到DNS服務(wù)器裹纳,使用shell命令操作參考如下:

helm repo add stable https://harbor.onwalk.net/chartrepo/knative
helm repo update

cat > cat > admin-values.yaml << EOF
clusterDomain: admin.local
sources:
  - service
  - ingress
domainFilters:
  - onwalk.net
policy: upsert-only
provider: alibabacloud
alibabacloud:
  accessKeyId: xxxxxxxxxx
  accessKeySecret: xxxxxxxxx
  regionId: rg-xxxxxx
  zoneType: public
EOF
helm upgrade -i external-dns stable/external-dns --version '5.4.11' -f admin-values.yaml -n external-dns --create-namespace --kube-context k8s-admin

將以上操作轉(zhuǎn)化為 ansible-playbook 的tasks 可以拆分為四個(gè) tasks 择葡,

  1. task1: Add stable chart repo 調(diào)用 kubernetes.core.helm_repository模塊
  2. task2: Update repo 調(diào)用 shell 模塊
  3. task3: Create NameSpace 調(diào)用 kubernetes.core.k8s 模塊
  4. Task4: Deploy External Dns 調(diào)用 kubernetes.core.helm 模塊
- hosts: localhost
  connection: local
  gather_facts: false

  tasks:
    - name: Add stable chart repo
      kubernetes.core.helm_repository:
        name: stable
        repo_url: "https://harbor.onwalk.net/chartrepo/knative"

    - name: Update repo
      shell: "helm repo update"

    - name: Create NameSpace
      kubernetes.core.k8s:
        api_version: v1
        kind: Namespace
        context: cube-admin
        name: external-dns
        state: present

    - name: Deploy External Dns
      kubernetes.core.helm:
        name: external-dns
        chart_ref: stable/external-dns
        chart_version: 5.4.11
        context: cube-admin
        release_namespace: external-dns
        values:
          clusterDomain: cube.local
          sources:
            - service
            - ingress
          domainFilters:
            - onwalk.net
          policy: upsert-only
          provider: alibabacloud
          alibabacloud:
            accessKeyId: xxxxxxxxxx
            accessKeySecret: xxxxxxxxx
            regionId: rg-xxxxxx
            zoneType: public      

將上訴文件保存為 deploy_external_dns.yaml, 執(zhí)行命令 ansible-playbook deploy_external_dns.yaml 命令執(zhí)行成功回看到返回如下類似結(jié)果:

PLAY [localhost] *****************************************************************************************************************************************************************

TASK [Add stable chart repo] *****************************************************************************************************************************************************
ok: [localhost]

TASK [Update repo] ***************************************************************************************************************************************************************
changed: [localhost]

TASK [Create NameSpace] **********************************************************************************************************************************************************
ok: [localhost]

TASK [Deploy External Dns] *******************************************************************************************************************************************************
ok: [localhost]

PLAY RECAP ***********************************************************************************************************************************************************************
localhost                  : ok=4    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

方式四:使用ansible-playbook roles來(lái)組織管理集群變更tasks

在方式三中,如果是管理一個(gè)集群剃氧,編寫一個(gè)deploy_external_dns.yaml就能完成工作敏储,如果管理多個(gè)集群,就要編寫多個(gè)yaml文件朋鞍,并且重復(fù)編寫很多差異不多的tasks 實(shí)際操作可能類似這個(gè)樣子:

ansible-playbook  k8s_dev1_deploy_external_dns.yaml
ansible-playbook  k8s_pre1_deploy_external_dns.yaml
ansible-playbook  k8s_prd1_deploy_external_dns.yaml
ansible-playbook  ...

經(jīng)過(guò)對(duì)比分析已添,這些tasks 主要差異變量:

  • context: cube-admin

  • clusterDomain: xxx.local

只要將以上兩個(gè)變量參考可配置化,最原始的四個(gè) tasks就可以復(fù)用滥酥,然后使用 Ansible role 重新組織tasks 文件更舞,拆分為兩個(gè)role:

  • helm-repository

  • external-dns

其中 external_dns 依賴 helm-repository 然后目錄結(jié)構(gòu)如下

roles/helm-repository
└── tasks
    └── main.yml
roles/external-dns
├── meta
│   └── main.yml
└── tasks
    └── main.yml

roles/helm-repository/main.yml

- name: Add stable chart repo
  kubernetes.core.helm_repository:
    name: stable
    repo_url: "https://harbor.onwalk.net/chartrepo/knative"
- name: Update repo
  shell: "helm repo update"

roles/external-dns/tasks/main.yml

- name: "cluster {{ clusterContext }} : Create NameSpace"
  kubernetes.core.k8s:
    api_version: v1
    kind: Namespace
    context: "{{ clusterContext }}"
    name: external-dns
    state: present

- name: "cluster {{ clusterContext }} : Deploy External Dns"
  kubernetes.core.helm:
    name: external-dns
    chart_ref: stable/external-dns
    chart_version: 5.4.11
    context: "{{ clusterContext }}"
    release_namespace: external-dns
    values:
      clusterDomain: "{{ clusterDomain }}"
      sources:
        - service
        - ingress
      domainFilters:
        - onwalk.net
      policy: upsert-only
      provider: alibabacloud
      alibabacloud:
        accessKeyId: xxxxxxxxx
        accessKeySecret: xxxxxxxxx
        regionId: rg-xxxxxxxxx
        zoneType: public

roles/external-dns/meta/main.yml

dependencies:
  - role: helm-repository

新建一個(gè)文件 deploy-chart-external-dns 來(lái)引用 role:helm-repository

- hosts: localhost
  connection: local
  gather_facts: false
  tasks:
    - include_role:
        name: external_dns
      vars:
        clusterContext: "{{ item.clusterContext }}"
        clusterDomain: "{{ item.clusterDomain }}"
      with_items:
        - { clusterContext: 'k8s-admin', clusterDomain: 'admin.local' }
        - { clusterContext: 'k8s-cube', clusterDomain: 'cube.local' }
        - { clusterContext: 'k8s-dev', clusterDomain: 'dev.local' }
        - { clusterContext: 'k8s-pre', clusterDomain: 'pre.local' }
        - ...

最后,僅僅需要維護(hù)一個(gè)可復(fù)用的 role:helm-repository 坎吻,以及在deploy-chart-external-dns 定義要集群屬性等變量缆蝉,就可以輕松的維護(hù)多集群內(nèi)的各類容器應(yīng)用了

執(zhí)行命令:ansible-playbook deploy-chart-external-dns 返回結(jié)果如下:


PLAY [localhost] *****************************************************************************************************************************************************************

TASK [include_role : external_dns] ***********************************************************************************************************************************************

TASK [helm-repository : Add stable chart repo] ***********************************************************************************************************************************
ok: [localhost]

TASK [helm-repository : Update repo] *********************************************************************************************************************************************
changed: [localhost]

TASK [external_dns : cluster k8s-admin : Create NameSpace] ***********************************************************************************************************************
ok: [localhost]

TASK [external_dns : cluster k8s-admin : Deploy External Dns] ********************************************************************************************************************
ok: [localhost]

TASK [external_dns : cluster cube-admin : Create NameSpace] **********************************************************************************************************************
ok: [localhost]

TASK [external_dns : cluster cube-admin : Deploy External Dns] *******************************************************************************************************************
ok: [localhost]

PLAY RECAP ***********************************************************************************************************************************************************************
localhost                  : ok=6    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

參考

  1. Ansible kubernetes.core.helm 模塊
    1. https://github.com/ansible-collections/kubernetes.core
    2. https://github.com/ansible-collections/kubernetes.core/blob/main/docs/kubernetes.core.helm_module.rst
  2. 使用 kubeconfig 文件組織多集群訪問(wèn):
    1. https://kubernetes.io/zh/docs/concepts/configuration/organize-cluster-access-kubeconfig/
    2. [https://kubernetes.io/zh/docs/tasks/access-application-cluster/configure-access-multiple-clusters/#set-the-kubeconfig-environment-variable](http://2. https://kubernetes.io/zh/docs/tasks/access-application-cluster/configure-access-multiple-clusters/#set-the-kubeconfig-environment-variable)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市瘦真,隨后出現(xiàn)的幾起案子刊头,更是在濱河造成了極大的恐慌,老刑警劉巖诸尽,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件原杂,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡您机,警方通過(guò)查閱死者的電腦和手機(jī)穿肄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)际看,“玉大人咸产,你說(shuō)我怎么就攤上這事≈倜觯” “怎么了脑溢?”我有些...
    開(kāi)封第一講書人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)蔼囊。 經(jīng)常有香客問(wèn)我焚志,道長(zhǎng),這世上最難降的妖魔是什么畏鼓? 我笑而不...
    開(kāi)封第一講書人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任酱酬,我火速辦了婚禮,結(jié)果婚禮上云矫,老公的妹妹穿的比我還像新娘膳沽。我一直安慰自己,他們只是感情好让禀,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布挑社。 她就那樣靜靜地躺著,像睡著了一般巡揍。 火紅的嫁衣襯著肌膚如雪痛阻。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 51,292評(píng)論 1 301
  • 那天腮敌,我揣著相機(jī)與錄音阱当,去河邊找鬼。 笑死糜工,一個(gè)胖子當(dāng)著我的面吹牛弊添,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播捌木,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼油坝,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了刨裆?” 一聲冷哼從身側(cè)響起澈圈,我...
    開(kāi)封第一講書人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎崔拥,沒(méi)想到半個(gè)月后极舔,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡链瓦,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年拆魏,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片慈俯。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡渤刃,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出贴膘,到底是詐尸還是另有隱情卖子,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布刑峡,位于F島的核電站洋闽,受9級(jí)特大地震影響玄柠,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜诫舅,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一羽利、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧刊懈,春花似錦这弧、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至卷哩,卻和暖如春蛋辈,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背殉疼。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工梯浪, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人瓢娜。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓挂洛,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親眠砾。 傳聞我的和親對(duì)象是個(gè)殘疾皇子虏劲,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容