{"id":23050604,"url":"https://github.com/ai-ql/kubernetes-handbook","last_synced_at":"2026-02-03T10:32:01.050Z","repository":{"id":250716693,"uuid":"835259809","full_name":"AI-QL/kubernetes-handbook","owner":"AI-QL","description":"Kubernetes handbook, use K3S Tencent Cloud as example","archived":false,"fork":false,"pushed_at":"2024-07-29T13:28:23.000Z","size":4,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-06-23T09:47:59.348Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/AI-QL.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-07-29T13:26:12.000Z","updated_at":"2024-07-29T13:28:26.000Z","dependencies_parsed_at":null,"dependency_job_id":"ab03005c-6422-4f69-88c7-c40db5ff17ea","html_url":"https://github.com/AI-QL/kubernetes-handbook","commit_stats":null,"previous_names":["aiql-community/kubernetes-handbook"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/AI-QL/kubernetes-handbook","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AI-QL%2Fkubernetes-handbook","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AI-QL%2Fkubernetes-handbook/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AI-QL%2Fkubernetes-handbook/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AI-QL%2Fkubernetes-handbook/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/AI-QL","download_url":"https://codeload.github.com/AI-QL/kubernetes-handbook/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AI-QL%2Fkubernetes-handbook/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29041336,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-03T10:09:22.136Z","status":"ssl_error","status_checked_at":"2026-02-03T10:09:16.814Z","response_time":96,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-12-15T23:34:53.150Z","updated_at":"2026-02-03T10:32:01.032Z","avatar_url":"https://github.com/AI-QL.png","language":null,"funding_links":[],"categories":[],"sub_categories":[],"readme":"# Kubernetes Handbook\n\nKubernetes handbook, this repo utilizes Tencent Cloud K3S as the demo environment  \n\nYou should already have a K3S/miniKube/K8S env with kubectl and envsubst as precondition\n\n## Install\n\n### Set Kube Config\n\nBy default, `$HOME/.kube` might exist an `config` and you do not need config it\n\n\u003cdetails open\u003e\n\u003csummary\u003e [Optional] \u003c/summary\u003e\n\n#### 1. Edit `/etc/profile`, you may need `sudo` to add\n```bash\nexport KUBECONFIG=/etc/rancher/k3s/k3s.yaml\n```\nFor lighthouse user, you may need to add `KUBECONFIG` in `.bashrc`\n\n\u003e You can exit Vim by `:wq!`\n\n\u003e In Tencent Cloud, you might not be able to leave Insert Mode  \n\u003e Please press `Ctrl + Shift + F5`  \n\u003e Or use `Ctrl + C` to force Command Mode  \n\u003e Or maybe you are in Record Mode, press `Q` to finish  \n\n\n#### 2. Apply\n\n```\nsource /etc/profile\n```\n\u003e You can check if it works by `echo $KUBECONFIG`\n\u003c/details\u003e \n\n#### You can set env `EMAIL` and `DOMAIN` for later use according to step 1:\n```bash\nexport EMAIL=xxx.xxx@gmail.com\nexport DOMAIN=xxx.com\n```\n\n### Install Helm\n```\ncurl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash\n```\n\n### Add Helm Repo\n```\nhelm repo add jetstack https://charts.jetstack.io \u0026\u0026 helm repo update\n```\n\n## Cert\n\n### Install Cert-Manager\n\n#### 1. Create namespace\n```\nkubectl create namespace cert-manager\n```\n\n#### 2. Install cert-manager\n\nCheck installeable version\n```\nhelm search repo cert-manager\n```\n\n```\nhelm install \\\n  cert-manager jetstack/cert-manager \\\n  --namespace cert-manager \\\n  --set installCRDs=true\n```\n\u003e   `--set installCRDs=true` : For ClusterIssuer later  \n\u003e   `--version v1.xx.x` ：You can specify an old version\n\n#### 3. [Optional] Install CRD\n\nSkip this step ff you already set `installCRDs` in previous\n\n\u003cdetails\u003e\n\u003csummary\u003e Manual install CRD \u003c/summary\u003e\n\nCheck installed version\n```\nhelm list -n cert-manager\n```\nApply the yaml, REMEMBER to replace the version number!!!\n```\nkubectl apply --validate=false -f https://github.com/jetstack/cert-manager/releases/download/v1.14.5/cert-manager.yaml\n```\n\u003c/details\u003e  \n\n\n\u003e This step could be also used for installation without `helm`\n\n#### 4. [Optional] Check Running Pods\n\n```\nkubectl get pods --namespace cert-manager\n```\n\n### Config ClusterIssuer\n\nRefer to [K3S Rocks](https://k3s.rocks/https-cert-manager-letsencrypt/)\n\n#### 1. Add ClusterIssuer\n\n\u003cdetails open\u003e\n\u003csummary\u003eletsencrypt-prod.yaml\u003c/summary\u003e\n\n```yaml\napiVersion: cert-manager.io/v1\nkind: ClusterIssuer\nmetadata:\n  name: letsencrypt-prod\nspec:\n  acme:\n    email: $EMAIL    # Email Address\n    server: https://acme-v02.api.letsencrypt.org/directory\n    privateKeySecretRef:\n      name: letsencrypt-prod\n    solvers:\n    - http01:\n        ingress:\n          class: traefik\n---\n\n```\n\n\u003c/details\u003e\n\n#### 2. Add Middleware\n\n\u003cdetails open\u003e\n\u003csummary\u003etraefik-https-redirect-middleware.yaml\u003c/summary\u003e\n\n```yaml\napiVersion: traefik.containo.us/v1alpha1\nkind: Middleware\nmetadata:\n  name: redirect-https\nspec:\n  redirectScheme:\n    scheme: https\n    permanent: true\n---\n\n\n```\n\n\u003c/details\u003e\n\n#### 3. Add Ingress\n\n\u003cdetails open\u003e\n\u003csummary\u003ewhoami-ingress-tls.yaml\u003c/summary\u003e\n\n```yaml\napiVersion: networking.k8s.io/v1\nkind: Ingress\nmetadata:\n  name: whoami-tls-ingress\n  annotations:\n    spec.ingressClassName: traefik\n    cert-manager.io/cluster-issuer: letsencrypt-prod\n    traefik.ingress.kubernetes.io/router.middlewares: default-redirect-https@kubernetescrd\n    # default is Namespace, redirect-https is Middleware name\nspec:\n  rules:\n    - host: whoami.$DOMAIN        # Domain name\n      http:\n        paths:\n          - path: /\n            pathType: Prefix      # Prefix | ImplementationSpecific\n            backend:\n              service:\n                name: whoami-svc  # Service name\n                port:\n                  number: 8888    # Service port, not pod port\n  tls:\n    - secretName: whoami-tls      # Certificate name\n      hosts:\n        - whoami.$DOMAIN          # Domain name\n---\n\n```\n\n\u003c/details\u003e\n\n#### 4. Add Service\n\n\u003cdetails open\u003e\n\u003csummary\u003enginx-service.yaml\u003c/summary\u003e\n\n```yaml\n\napiVersion: v1\nkind: Service\nmetadata:\n  labels:\n    app: nginx-app\n  name: whoami-svc\n  namespace: default\nspec:\n  ports:\n    - port: 8888        # Service port\n      protocol: TCP\n      name: app-port\n      targetPort: 80\n  type: ClusterIP\n  selector:\n    app: nginx-app\n---\n\n```\n\n\u003c/details\u003e\n\n#### 5. Add Deployment\n\n\u003cdetails open\u003e\n\u003csummary\u003enginx-deployment.yaml\u003c/summary\u003e\n\n```yaml\n\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: nginx-deployment\nspec:\n  selector:\n    matchLabels:\n      app: nginx-app\n  replicas: 2 # Tells deployment to run 2 pods matching the template\n  template:\n    metadata:\n      labels:\n        app: nginx-app\n    spec:\n      containers:\n      - name: nginx-app\n        image: nginx:1.26.0\n        ports:\n        - containerPort: 80\n---\n\n```\n\n\u003c/details\u003e\n\n\n## Deployment\n\n### Check Deployment\n\n```\ncat *.yaml | envsubst\n```\n\u003e Check if `DOMAIN` and `EMAIL` is correctly filled\n\n### Apply Deployment\n\n```\ncat *.yaml | envsubst | kubectl apply -f -\n```\n\u003e Each yaml file should have a separator `---`  with line break in the end, otherwise it cannot be parsed\n\n### Delete Deployment\n```\nkubectl delete all -l app=nginx-app\n```\n\n\u003e `delete all` will not delete ingress,configmap,etc.\n\n## Done\n\nNow, you can check the welcome page by:  \n\nhttps://whoami.$DOMAIN/\n\n\u003cEOF\u003e\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fai-ql%2Fkubernetes-handbook","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fai-ql%2Fkubernetes-handbook","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fai-ql%2Fkubernetes-handbook/lists"}