多K8S集群运维管理参考

环境

  1. K8S集群
    1. 集群一: k8s-admin 集群访问凭证保存为 ~/kubeconfig-k8s-admin
    2. 集群二: k8s-cube 集群访问凭证保存为 ~/kubeconfig-k8s-cube
  2. OPS主机需要软件列表:helm,kubectl,ansible
    1. MacOS系统:
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

方式一:使用多个 kubeconfig 文件来管理多集群

可以通过--kubeconfig 命令行参数来选择操作不同集群

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 文件来管理多集群

使用默认的 kubeconfig 文件, 需要将多个 kubeconfig 合并,保存在kubeconfig 的默认位置$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)用户和 以及相关联的(contexts)上下文,如果使用Uk8s 可以在控制台: 概览-> 内网凭证/外网凭证 查看需要的凭证,然后按照上述格式补全即可

  1. 在执行kubectl 命令时需要执行 --context 命令行参数, 来选择操作不同集群

  2. 在执行helm 命令时需要执行 --kube-context 命令行参数, 来选择操作不同集群

  3. 在执行kubectl helm 命令不指定参数,则选则文件中的current-context作为默认集群

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 来管理集群内的容器应用

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

场景描述: 目前我们需要使用helm安装一个external-dns 用来将 ingess对接的域名解析规则,自动同步到DNS服务器,使用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

将以上操作转化为 ansible-playbook 的tasks 可以拆分为四个 tasks ,

  1. task1: Add stable chart repo 调用 kubernetes.core.helm_repository模块
  2. task2: Update repo 调用 shell 模块
  3. task3: Create NameSpace 调用 kubernetes.core.k8s 模块
  4. Task4: Deploy External Dns 调用 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, 执行命令 ansible-playbook deploy_external_dns.yaml 命令执行成功回看到返回如下类似结果:

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来组织管理集群变更tasks

在方式三中,如果是管理一个集群,编写一个deploy_external_dns.yaml就能完成工作,如果管理多个集群,就要编写多个yaml文件,并且重复编写很多差异不多的tasks 实际操作可能类似这个样子:

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  ...

经过对比分析,这些tasks 主要差异变量:

  • context: cube-admin

  • clusterDomain: xxx.local

只要将以上两个变量参考可配置化,最原始的四个 tasks就可以复用,然后使用 Ansible role 重新组织tasks 文件,拆分为两个role:

  • helm-repository

  • external-dns

其中 external_dns 依赖 helm-repository 然后目录结构如下

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

新建一个文件 deploy-chart-external-dns 来引用 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' }
        - ...

最后,仅仅需要维护一个可复用的 role:helm-repository ,以及在deploy-chart-external-dns 定义要集群属性等变量,就可以轻松的维护多集群内的各类容器应用了

执行命令:ansible-playbook deploy-chart-external-dns 返回结果如下:


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 文件组织多集群访问:
    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)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容