{"id":22166403,"url":"https://github.com/alextanhongpin/kubernetes-structure","last_synced_at":"2025-07-26T11:32:50.298Z","repository":{"id":79115059,"uuid":"129598147","full_name":"alextanhongpin/kubernetes-structure","owner":"alextanhongpin","description":"A structured approach for handling large kubernetes project","archived":false,"fork":false,"pushed_at":"2024-03-17T07:28:42.000Z","size":856,"stargazers_count":10,"open_issues_count":1,"forks_count":1,"subscribers_count":3,"default_branch":"master","last_synced_at":"2024-04-14T23:09:43.436Z","etag":null,"topics":["blue-green-deployment","conduit","customresourcedefinitions","grpc","ingress","kubernetes","linkerd","namerd","traffic-shifting"],"latest_commit_sha":null,"homepage":null,"language":"Makefile","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/alextanhongpin.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}},"created_at":"2018-04-15T10:08:39.000Z","updated_at":"2024-03-20T22:30:43.000Z","dependencies_parsed_at":"2024-03-15T17:43:13.349Z","dependency_job_id":null,"html_url":"https://github.com/alextanhongpin/kubernetes-structure","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/alextanhongpin%2Fkubernetes-structure","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/alextanhongpin%2Fkubernetes-structure/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/alextanhongpin%2Fkubernetes-structure/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/alextanhongpin%2Fkubernetes-structure/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/alextanhongpin","download_url":"https://codeload.github.com/alextanhongpin/kubernetes-structure/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":227674114,"owners_count":17802329,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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":["blue-green-deployment","conduit","customresourcedefinitions","grpc","ingress","kubernetes","linkerd","namerd","traffic-shifting"],"created_at":"2024-12-02T05:19:24.583Z","updated_at":"2024-12-02T05:19:25.247Z","avatar_url":"https://github.com/alextanhongpin.png","language":"Makefile","funding_links":[],"categories":[],"sub_categories":[],"readme":"# kubernetes-guide\n\n## Start Local\n\n```bash\n# Start the local minikube with RBAC enabled\n# Default memory is 1024 and cpu is 1\n$ minikube start --memory 2048 --cpus 2 --extra-config=apiserver.Authorization.Mode=RBAC\n\n# Use local docker image\n$ eval $(minikube docker-env)\n\n# OR\n\n$ make start\n```\n\n\n## Steps\n\n- Create Namespace\n- Create ServiceAccount\n\n\n## Get Contexts\n\n```bash\n$ kubectl config get-contexts\n```\n\nOutput:\n\n```\nCURRENT   NAME       CLUSTER    AUTHINFO   NAMESPACE\n*         minikube   minikube   minikube\n```\n\n\n## Switch Contexts\n\n```bash\n$ kubectl config set-context $(kubectl config current-context) --namespace=${NAMESPACE}\nContext \"minikube\" modified.\n```\n\nOutput:\n\n```bash\n$ kubectl config get-contexts\nCURRENT   NAME       CLUSTER    AUTHINFO   NAMESPACE\n*         minikube   minikube   minikube   dev\n```\n\nShortcut:\n\n```bash\n$ alias ksc='kubectl config set-context $(kubectl config current-context) --namespace '\n\n# Switch to default\n$ ksc default\n```\n\n## Deploy Linkerd\n\n```bash\n# Create accounts\n$ kubectl create -f accounts/default.yml\n\n# Create namespace\n$ kubectl create -f namespaces/linkerd.yml\n\n# Create roles\n$ kubectl create -f roles/linkerd.yml\n\n# Create linkerd services\n$ kubectl create -f services/linkerd --record\n\n# Create services that calls linkerd\n$ kubectl create -f services/helloworld --record\n\n## All-in-one\n$ kubectl apply -f accounts -f roles -f services/linkerd -f services/helloworld --record\n```\n\nOutput:\n\n```bash\nWarning: kubectl apply should be used on resource created by either kubectl create --save-config or kubectl apply\nserviceaccount \"default\" configured\nserviceaccount \"john\" configured\nclusterrole.rbac.authorization.k8s.io \"linkerd-endpoints-reader\" configured\nclusterrole.rbac.authorization.k8s.io \"namerd-dtab-storage\" configured\nclusterrolebinding.rbac.authorization.k8s.io \"linkerd-role-binding\" configured\nclusterrolebinding.rbac.authorization.k8s.io \"namerd-role-binding\" configured\nconfigmap \"l5d-config\" configured\ndaemonset.extensions \"l5d\" created\nservice \"l5d\" created\ndeployment.apps \"hello\" created\nservice \"hello\" created\ndeployment.apps \"world-v1\" created\nservice \"world-v1\" created\n```\n\n## Test Linkerd\n\n```bash\n$ make l5d-test\n```\n\nOutput:\n\n```bash\nHello (172.17.0.9) world (172.17.0.12)!!http_proxy=http://192.168.99.100:30891 curl -s http://hello\nHello (172.17.0.9) world (172.17.0.10)!!http_proxy=http://192.168.99.100:30891 curl -s http://world\nworld (172.17.0.12)!%\n```\n\n![admin ui](assets/admin.png)\n\n## Conduit\n\n### Installation\n\n```bash\n$ conduit install | kubectl apply -f -\n```\n\nOutput:\n\n```bash\nnamespace \"conduit\" created\nserviceaccount \"conduit-controller\" created\nclusterrole.rbac.authorization.k8s.io \"conduit-controller\" created\nclusterrolebinding.rbac.authorization.k8s.io \"conduit-controller\" configured\nserviceaccount \"conduit-prometheus\" created\nclusterrole.rbac.authorization.k8s.io \"conduit-prometheus\" created\nclusterrolebinding.rbac.authorization.k8s.io \"conduit-prometheus\" configured\nservice \"api\" created\nservice \"proxy-api\" created\ndeployment.extensions \"controller\" created\nservice \"web\" created\ndeployment.extensions \"web\" created\nservice \"prometheus\" created\ndeployment.extensions \"prometheus\" created\nconfigmap \"prometheus-config\" created\nservice \"grafana\" created\ndeployment.extensions \"grafana\" created\nconfigmap \"grafana-config\" created\nconfigmap \"grafana-dashboards\" created\n```\n\n### Check\n\n```bash\n$ conduit check\n```\n\nOutput:\n\n```bash\nkubernetes-api: can initialize the client.......................................[ok]\nkubernetes-api: can query the Kubernetes API....................................[ok]\nkubernetes-api: is running the minimum Kubernetes API version...................[ok]\nconduit-api: can query the Conduit API..........................................[ok]\nconduit-api[telemetry]: control plane can use telemetry service.................[ERROR] -- Error talking to telemetry service from control plane: rpc error: code = Unknown desc = Get http://prometheus.conduit.svc.cluster.local:9090/api/v1/query?query=reports_total%5B30s%5D: dial tcp: i/o timeout\nconduit-version: cli is up-to-date..............................................[ok]\nconduit-version: control plane is up-to-date....................................[ok]\n\nStatus check results are [ERROR]\n```\n\n### Dashboard\n\n```bash\n# Hint open the dashboard immediately to prevent the issue above from happening\n$ conduit dashboard\n```\n\nOutput:\n\n```bash\nConduit dashboard available at:\nhttp://127.0.0.1:49646/api/v1/namespaces/conduit/services/web:http/proxy/\nOpening the default browser\nStarting to serve on 127.0.0.1:49646\n```\n\n### Deployment\n\n```bash\n$ conduit inject services/echo-conduit/deployment.yml | kubectl apply -f -\n```\n\n### Delete\n\n```bash\n$ conduit install | kubectl delete -f -\n```\n\n### Stats\n\n```bash\n$ conduit stat deployments\n$ conduit tap deploy echo\n```\n\n![conduit-ui](assets/conduit.png)\n\n## Linkerd Ingress\n\n```bash\n# Enable Ingress\n$ minikube addons enable ingress\n\n$ kubectl create ns l5d-system\n$ kubectl apply -f services/linkerd-ingress\n\n# Port-forward ui\n# $ kubectl port-forward l5d-rhbrr 9990:9990\n\n# In minikube, external load balancer support is unavailable, use hostIP\nHOST_IP=$(kubectl get po -l app=l5d -o jsonpath=\"{.items[0].status.hostIP}\")\nL5D_SVC_IP=$HOST_IP:$(kubectl get svc l5d -o 'jsonpath={.spec.ports[0].nodePort}')\ncurl http://$L5D_SVC_IP\nopen http://$HOST_IP:$(kubectl get svc l5d -o 'jsonpath={.spec.ports[1].nodePort}')\n\n# Log the linkerd pods\n$ kubectl logs $(kubectl get po -l app=l5d  -o jsonpath='{.items[0].metadata.name}') l5d\n\n# Test\n$ curl -H \"Host: world.v2\" http://$L5D_SVC_IP\nworld (172.17.0.16)!%\n```\n\n### Ingress\n\n```bash\n$ kubectl get ingress\nNAME          HOSTS      ADDRESS   PORTS     AGE\nhello-world   world.v2             80        11m\n```\n\n## Checklist\n\n- [x] service discovery\n- [x] http load balancing\n- [x] gRPC load balancing\n- [ ] fluentd logging\n- [ ] metrics aggregation with heapster\n\n\n## Cheat Sheet\n\nGet all resources in a namespace:\n```bash\n$ kubectl get all --namespace tmp\n$ kubectl get all -n tmp\n```\n\nForce delete all pods:\n\n```bash\n$ kubectl delete pod \u003cpod_name\u003e -n \u003cnamespace\u003e --grace-period 0 --force\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Falextanhongpin%2Fkubernetes-structure","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Falextanhongpin%2Fkubernetes-structure","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Falextanhongpin%2Fkubernetes-structure/lists"}