Skip to content

Instantly share code, notes, and snippets.

@taking
Last active August 21, 2024 14:50
Show Gist options
  • Save taking/b3e3a81db06ccdc233a45380f7188a50 to your computer and use it in GitHub Desktop.
Save taking/b3e3a81db06ccdc233a45380f7188a50 to your computer and use it in GitHub Desktop.

Karmada Installation with Helm

  • Karmada on Kubernetes

Prerequisites

  • Kubernetes 1.20+
  • Helm 3.2.0+

Reference

Helm Update

helm repo add karmada-charts https://raw.githubusercontent.com/karmada-io/karmada/master/charts
helm repo update karmada-charts

Helm Install

helm upgrade --install karmada karmada-charts/karmada \
  --kubeconfig=$HOME/.kube/config \
  --create-namespace \
  --namespace karmada-system \
  --set karmadaImageVersion=1.8.0 \
  --set apiServer.hostNetwork=false \
  --set apiServer.serviceType=NodePort \
  --set apiServer.nodePort=32443 \
  --set certs.auto.hosts[0]="kubernetes.default.svc" \
  --set certs.auto.hosts[1]="*.etcd.karmada-system.svc.cluster.local" \
  --set certs.auto.hosts[2]="*.karmada-system.svc.cluster.local" \
  --set certs.auto.hosts[3]="*.karmada-system.svc" \
  --set certs.auto.hosts[4]="localhost" \
  --set certs.auto.hosts[5]="127.0.0.1" \
  --set certs.auto.hosts[6]="192.168.0.140" \
  --set certs.auto.hosts[7]="100.64.0.1" \
  --set certs.auto.hosts[8]="100.64.0.*"

image

Export kubeconfig

kubectl get secret --kubeconfig=$HOME/.kube/config -n karmada-system karmada-kubeconfig -o jsonpath={.data.kubeconfig} | base64 -d > $HOME/.kube/karmada-config

internal_ip="$(hostname -I | awk {'print $1'})"
sed -i "6s/.*/      server: https:\/\/${internal_ip}:32443/g" $HOME/.kube/karmada-config

kubectl get clusters,deployments --kubeconfig=$HOME/.kube/karmada-config

Install Agent (in Member Cluster)

  • Karmada Host 에 설치하지 않기
  • 설명

Option

  • base64 decoding
    • caCrt is karmada kubeconfig certificate-authority-data
    • crt is karmada kubeconfig client-certificate-data
    • key is karmada kubeconfig client-key-data
    • serverIp is karmada Node Ip Address:32443
echo $(grep certificate-authority-data $HOME/.kube/karmada-config | awk '{print $2}' | base64 -d)
echo $(grep client-certificate-data $HOME/.kube/karmada-config | awk '{print $2}' | base64 -d)
echo $(grep client-key-data $HOME/.kube/karmada-config | awk '{print $2}' | base64 -d)

Helm Update

helm repo add karmada-charts https://raw.githubusercontent.com/karmada-io/karmada/master/charts
helm repo update karmada-charts

Helm Install

_hostname=$(hostname | tr '_' '-')
_cacrt=$(grep certificate-authority-data $HOME/.kube/karmada-config | awk '{print $2}' | base64 -d)
_crt=$(grep client-certificate-data $HOME/.kube/karmada-config | awk '{print $2}' | base64 -d)
_key=$(grep client-key-data $HOME/.kube/karmada-config | awk '{print $2}' | base64 -d)

helm upgrade --install karmada karmada-charts/karmada \
  --kubeconfig=$HOME/.kube/kubernetes-01-config \
  --create-namespace \
  --namespace karmada-system \
  --set karmadaImageVersion=1.8.0 \
  --set installMode=agent \
  --set agent.clusterName="$_hostname" \
  --set agent.kubeconfig.caCrt="$_cacrt" \
  --set agent.kubeconfig.crt="$_crt" \
  --set agent.kubeconfig.key="$_key" \
  --set agent.kubeconfig.server=https://100.64.0.1:32443

image

Karmada Deploy & Propagation

root@karmada:~# kubectl get clusters --kubeconfig=$HOME/.kube/karmada-config
NAME            VERSION    MODE   READY   AGE
kubernetes-01   v1.25.16   Pull   True    4m54s
kubernetes-02   v1.25.16   Pull   True    49s
kubernetes-03   v1.25.16   Pull   True    45s
cat << 'EOF' > nginx-deployment-service.yaml
# nginx-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 10
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:latest
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-svc
spec:
  ports:
  - port: 80
    targetPort: 80
  selector:
    app: nginx
EOF
cat << 'EOF' > nginx-propagation.yaml
# nginx-propagation.yaml
apiVersion: policy.karmada.io/v1alpha1
kind: PropagationPolicy
metadata:
  name: nginx-propagation
  namespace: default
spec:
  resourceSelectors:
    - apiVersion: apps/v1
      kind: Deployment
      name: nginx-deployment
      namespace: default
    - apiVersion: apps/v1
      kind: Service
      name: nginx-svc
      namespace: default
  placement:
    clusterAffinity:
      clusterNames:
        - kubernetes-01
        - kubernetes-02        
        - kubernetes-03
    replicaScheduling:
      replicaDivisionPreference: Weighted
      replicaSchedulingType: Divided
      weightPreference:
        staticWeightList:
          - targetCluster:
              clusterNames:
                - kubernetes-01
            weight: 2
          - targetCluster:
              clusterNames:
                - kubernetes-02
            weight: 3
          - targetCluster:
              clusterNames:
                - kubernetes-03
            weight: 1
EOF
kubectl apply -f nginx-deployment-service.yaml --kubeconfig $HOME/.kube/karmada-config
kubectl apply -f nginx-propagation.yaml --kubeconfig $HOME/.kube/karmada-config

image

Uninstall

helm upgrade --install karmada karmada-charts/karmada \
  --create-namespace \
  --namespace karmada-system \
  --dependency-update \
  --set components={"descheduler"}
helm uninstall karmada -n karmada-system

kubectl delete sa/karmada-pre-job -n karmada-system
kubectl delete clusterRole/karmada-pre-job
kubectl delete clusterRoleBinding/karmada-pre-job
kubectl delete ns karmada-system

rm -rf /var/lib/karmada* /etc/karmada*
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment