v0.10 升级到 v1.0

遵循常规升级流程

升级后显著变化

引入 karmada-aggregated-apiserver 组件

在 v1.0.0 版本之前,我们使用 CRD 扩展 Cluster API, 从 v1.0.0 开始,我们使用 API Aggregation(AA) 进行扩展。

基于上述变化,将在升级期间执行以下操作:

步骤 1:停止 karmada-apiserver

通过将副本数更新为 0 可以停止 karmada-apiserver

步骤 2:从 ETCD 移除 Cluster CRD

通过运行以下命令直接从 ETCD 移除 Cluster CRD

  1. etcdctl --cert="/etc/kubernetes/pki/etcd/karmada.crt" \
  2. --key="/etc/kubernetes/pki/etcd/karmada.key" \
  3. --cacert="/etc/kubernetes/pki/etcd/server-ca.crt" \
  4. del /registry/apiextensions.k8s.io/customresourcedefinitions/clusters.cluster.karmada.io

注:此命令仅移除 CRD 资源,不会更改所有 CR(Cluster 对象)。 这就是为什么不通过 karmada-apiserver 移除 CRD 的原因。

步骤 3:为 karmada-aggregated-apiserver 准备证书

为了避免 CA 重用和冲突, 需创建 CA 签名程序并对证书签名以启用聚合层。

karmada-system 命名空间中更新 karmada-cert-secret Secret:

  1. apiVersion: v1
  2. kind: Secret
  3. metadata:
  4. name: karmada-cert-secret
  5. namespace: karmada-system
  6. type: Opaque
  7. data:
  8. ...
  9. + front-proxy-ca.crt: |
  10. + {{front_proxy_ca_crt}}
  11. + front-proxy-client.crt: |
  12. + {{front_proxy_client_crt}}
  13. + front-proxy-client.key: |
  14. + {{front_proxy_client_key}}

然后更新 karmada-apiserver Deployment 的容器命令:

  1. - - --proxy-client-cert-file=/etc/kubernetes/pki/karmada.crt
  2. - - --proxy-client-key-file=/etc/kubernetes/pki/karmada.key
  3. + - --proxy-client-cert-file=/etc/kubernetes/pki/front-proxy-client.crt
  4. + - --proxy-client-key-file=/etc/kubernetes/pki/front-proxy-client.key
  5. - - --requestheader-client-ca-file=/etc/kubernetes/pki/server-ca.crt
  6. + - --requestheader-client-ca-file=/etc/kubernetes/pki/front-proxy-ca.crt

更新之后,恢复 karmada-apiserver 实例的副本。

步骤 4:部署 karmada-aggregated-apiserver

通过以下清单(manifest)将 karmada-aggregated-apiserver 实例部署到你的 host cluster

展开查看 yaml

  1. ---
  2. apiVersion: apps/v1
  3. kind: Deployment
  4. metadata:
  5. name: karmada-aggregated-apiserver
  6. namespace: karmada-system
  7. labels:
  8. app: karmada-aggregated-apiserver
  9. apiserver: "true"
  10. spec:
  11. selector:
  12. matchLabels:
  13. app: karmada-aggregated-apiserver
  14. apiserver: "true"
  15. replicas: 1
  16. template:
  17. metadata:
  18. labels:
  19. app: karmada-aggregated-apiserver
  20. apiserver: "true"
  21. spec:
  22. automountServiceAccountToken: false
  23. containers:
  24. - name: karmada-aggregated-apiserver
  25. image: swr.ap-southeast-1.myhuaweicloud.com/karmada/karmada-aggregated-apiserver:v1.0.0
  26. imagePullPolicy: IfNotPresent
  27. volumeMounts:
  28. - name: k8s-certs
  29. mountPath: /etc/kubernetes/pki
  30. readOnly: true
  31. - name: kubeconfig
  32. subPath: kubeconfig
  33. mountPath: /etc/kubeconfig
  34. command:
  35. - /bin/karmada-aggregated-apiserver
  36. - --kubeconfig=/etc/kubeconfig
  37. - --authentication-kubeconfig=/etc/kubeconfig
  38. - --authorization-kubeconfig=/etc/kubeconfig
  39. - --karmada-config=/etc/kubeconfig
  40. - --etcd-servers=https://etcd-client.karmada-system.svc.cluster.local:2379
  41. - --etcd-cafile=/etc/kubernetes/pki/server-ca.crt
  42. - --etcd-certfile=/etc/kubernetes/pki/karmada.crt
  43. - --etcd-keyfile=/etc/kubernetes/pki/karmada.key
  44. - --tls-cert-file=/etc/kubernetes/pki/karmada.crt
  45. - --tls-private-key-file=/etc/kubernetes/pki/karmada.key
  46. - --audit-log-path=-
  47. - --feature-gates=APIPriorityAndFairness=false
  48. - --audit-log-maxage=0
  49. - --audit-log-maxbackup=0
  50. resources:
  51. requests:
  52. cpu: 100m
  53. volumes:
  54. - name: k8s-certs
  55. secret:
  56. secretName: karmada-cert-secret
  57. - name: kubeconfig
  58. secret:
  59. secretName: kubeconfig
  60. ---
  61. apiVersion: v1
  62. kind: Service
  63. metadata:
  64. name: karmada-aggregated-apiserver
  65. namespace: karmada-system
  66. labels:
  67. app: karmada-aggregated-apiserver
  68. apiserver: "true"
  69. spec:
  70. ports:
  71. - port: 443
  72. protocol: TCP
  73. targetPort: 443
  74. selector:
  75. app: karmada-aggregated-apiserver

然后,通过以下清单将 APIService 部署到 karmada-apiserver

展开查看 yaml

  1. apiVersion: apiregistration.k8s.io/v1
  2. kind: APIService
  3. metadata:
  4. name: v1alpha1.cluster.karmada.io
  5. labels:
  6. app: karmada-aggregated-apiserver
  7. apiserver: "true"
  8. spec:
  9. insecureSkipTLSVerify: true
  10. group: cluster.karmada.io
  11. groupPriorityMinimum: 2000
  12. service:
  13. name: karmada-aggregated-apiserver
  14. namespace: karmada-system
  15. version: v1alpha1
  16. versionPriority: 10
  17. ---
  18. apiVersion: v1
  19. kind: Service
  20. metadata:
  21. name: karmada-aggregated-apiserver
  22. namespace: karmada-system
  23. spec:
  24. type: ExternalName
  25. externalName: karmada-aggregated-apiserver.karmada-system.svc.cluster.local

步骤 5:检查集群状态

如果一切顺利,你就可以像升级前一样查看所有集群。

  1. kubectl get clusters

karmada-agent 需要一个额外的 impersonate 动作

为了代理用户的请求,karmada-agent 现在会请求一个额外的 impersonate 动作。 请检查 ClusterRole 配置或应用以下清单。

  1. apiVersion: rbac.authorization.k8s.io/v1
  2. kind: ClusterRole
  3. metadata:
  4. name: karmada-agent
  5. rules:
  6. - apiGroups: ['*']
  7. resources: ['*']
  8. verbs: ['*']
  9. - nonResourceURLs: ['*']
  10. verbs: ["get"]

MCS 特性现在支持 Kubernetes v1.21+

Kubernetes v1.21 已弃用 EndpointSlicesdiscovery.k8s.io/v1beta1,取而代之的是 discovery.k8s.io/v1,Karmada 在 v1.0.0 版本中适配了这项变更。 现在 MCS 特性需要成员集群版本不低于 v1.21。