[TOC]
kubeconfig 文件使用 将 k8s 的配置文件拷贝到 ~/.kube/ 目录下,命名为 config,最后得到的是 ~./.kube/config
kubeconfig 配置文件的解释,生成请看官方文档
https://jimmysong.io/kubernetes-handbook/guide/authenticate-across-clusters-kubeconfig.html
使用 kubeconfig 文件配置跨集群认证 当你有了权限的 kubeconfig 文件后(如上文),那么在你的wsl下,执行如下就能连接到你的开发环境的 k8s集群
1 kubectl -n dev-cm get pods
跨集群认证:https://jimmysong.io/kubernetes-handbook/guide/authenticate-across-clusters-kubeconfig.html
使用端口转发来访问集群中的应用 1 2 3 4 kubectl -n dev-cm port-forward pods/redis-master-765d459796-258hz 7000:6379 这样的话,访问本地的 7000 端口,相当于访问了redis-master-765d459796-258hz 这个节点 # 参考:https://kubernetes.io/zh/docs/tasks/access-application-cluster/port-forward-access-application-cluster/
coredns 设置k8s集群公用的hosts配置
需求
kubernetes集群外部有一些服务(比如redis、mongo、pulsar),集群内部pod需要通过服务所在的主机的hostname访问服务。
不希望在所有的worker上都设置/etc/hosts, (不方便维护)
希望集群能统一管理解析hostname, 所有pod共用
指令 1 2 3 4 5 kubectl get configmap coredns -o yaml -n kube-system kubectl apply -f coredns.yaml
外部访问 需求
需要一个代理服务提供统一的入口,来转发外部访问kubernetes集群内部服务的请求,而不是暴露所有服务端口到宿主机
外部访问服务需要明确知道这个统一入口的地址(地址列表),方便把请求转发过来
这个代理服务需要实时感知集群内部服务的网络变化情况
要能灵活的配置路由规则
解决
为了满足上面的需求,k8s提供了ingress机制。目前比较流行的ingress controller有 nginx-ingress 和 traefik。
https://docs.traefik.io/v2.0/routing/providers/kubernetes-crd/
文件示例 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 apiVersion: v1 data: Corefile: | .:53 { errors health hosts { 10.23.112.157 etcd001 10.23.111.56 es001 fallthrough } kubernetes cluster.local in-addr.arpa ip6.arpa { pods insecure upstream fallthrough in-addr.arpa ip6.arpa ttl 30 } prometheus :9153 forward . /etc/resolv.conf cache 30 loop reload loadbalance } kind: ConfigMap metadata: creationTimestamp: "2019-09-10T11:59:48Z" name: coredns namespace: kube-system
Namespace Namespace 是对一组资源和对象的抽象集合,比如可以用来将系统内部的对象划分为不同的项目组或用户组。常见的 pods, services, replication controllers 和 deployments 等都是属于某一个 namespace 的(默认是 default),而 node, persistentVolumes 等则不属于任何 namespace。
Service Service 是应用服务的抽象,通过 labels 为应用提供负载均衡和服务发现。匹配 labels 的 Pod IP 和端口列表组成 endpoints,由 kube-proxy 负责将服务 IP 负载均衡到这些 endpoints 上。
每个 Service 都会自动分配一个 cluster IP(仅在集群内部可访问的虚拟地址)和 DNS 名,其他容器可以通过该地址或 DNS 来访问服务,而不需要了解后端容器的运行。
1 2 3 4 5 6 7 8 9 |># kcs | grep robotser robotserver-pf-service ClusterIP 172.96.98.90 <none> 8080/TCP 22d robotserver-service ClusterIP 172.96.179.246 <none> 8080/TCP,8081/TCP 22d # 进入pod |># kc exec -it deploy/robotserver-deploy bash # 通过集群内虚拟 ip + port 访问 curl "172.96.98.90:8080/testing/reply"
kubectl 常用指令 别名 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 export namespace_alias="dev-cm" alias kc='kubectl -n ${namespace_alias}' alias kcc='kubectl -n ${namespace_alias} get cm' alias kcd='kubectl -n ${namespace_alias} get deploy' alias kcp='kubectl -n ${namespace_alias} -o wide get pod' alias kcs='kubectl -n ${namespace_alias} get service' alias kcpg='kubectl -n ${namespace_alias} -o wide get pod | grep' alias kcdes='kubectl -n ${namespace_alias} describe' alias kce='kubectl -n ${namespace_alias} exec -it deploy/' alias kcr='kubectl -n ${namespace_alias} rollout restart deploy' alias ec='cd ~/k8s-app-deploy/ns-prod/ecrobot' alias cdl='cd /var/log/xiaoduo/${namespace_alias}/' alias dpg='docker ps | grep' alias mg='kubectl -n ${namespace_alias} exec -it mongo-42-0 mongo' alias qwer='git add . && git commit -m "fix" && git push' alias qwe='git add . && git commit -m "fix" && git push gitee' alias gc='git checkout' alias gcm='git checkout master' alias gcb='git checkout -' alias gp='git pull' alias gb='git branch' alias gbd='git branch -D' alias gl='git log'
常用命令 get 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 kc get nodes kc get deployments kc get deploy kc get services kc get svc kc get configmaps kc get cm kc get pods kc get pod kc get deploy configure-tb-deploy -o yaml kc get cm conf-configure-tb -o yaml
删除 1 2 3 4 5 6 7 8 9 10 kc delete svc sdk-tb-service kc delete deploy deploy-sdk-tb-api kc delete pods robotserver-pf-pro-deploy-7c6c4b994f-cjxlz --force --grace-period=0 kubectl delete deployment-ee-janus-confcache-1-7cbf798f88-dj4rg
其他 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 # 前置条件 配置文件路径:~/.kube/config, kubectl -n dev-cm get pods # 修改部署镜像 kc set image deploy configure-jd-deploy configure-jd=registry.cn-zhangjiakou.aliyuncs.com/xiaoduoai/ecrobot-configure-jd:v3.4.19 kc set image deploy config-check-deploy config-check= # 编辑资源 # 编辑 ConfigMap kc edit cm --save-config conf-configure-tb # 编辑 deployment 资源 kc edit deploy --save-config configure-tb-deploy # 重启服务 kc rollout restart deploy configure-tb-deploy # 强制删除pods # kubectl drain 安全驱逐节点上面所有的 pod kc get nodes # 想查看有哪些节点 kc drain <node name> kc drain alizjk-023112166-kubelet-ks-high --ignore-daemonsets kc drain alizjk-023112165-kubelet-ks-high --ignore-daemonsets # 一次驱逐多个node kc drain alizjk-023112163-kubelet-ks-high alizjk-023112162-kubelet-ks-high --ignore-daemonsets # 执行完成后,如果没有任何错误返回,您可以关闭节点(如果是在云平台上,可以删除支持该节点的虚拟机)。如果在维护操作期间想要将节点留在集群,那么您需要运行下面命令: kubectl uncordon <node name> # 然后,它将告知 Kubernetes 允许调度新的 pod 到该节点。 # 驱逐了节点上的pod后,最好在master上删除node kc delete nodes <node name> # 调整服务的副本数 # 暂时将服务的副本数设置成 0,达到“停止服务”的目的 kc scale --replicas=0 deploy configure-internal-tb-deploy # 之后可以将副本数修改成 1 来重新启动服务 kc scale --replicas=1 deploy configure-internal-tb-deploy # 进入容器内部 kc exec -it mongo-accounting-xxx mongo # 如何 ping 服务, 进入一个容器内容,让后 ping service-name # 查看容器的日志 kc logs -f user-service-deploy-58bd484789-7ct66 user-service # -f 参数是持续跟踪日志的输出 # "user-service-deploy-58bd484789-7ct66" 是 pod 的名称,由于这个 pod 里面运行了两个容器,所以需指定查看哪个容器的日志 "user-service" 是 pod 里面其中一个容器的名字# 基于配置文件部署 # 创建 ConfigMap 配置文件可以是 yaml 格式, 也可以是 json 格式 kc create configmap conf-goods-center --from-file=./goods_center.toml kc create cm conf-goods-center --from-file=./goods_center.toml kc apply -f deployment.yaml kc apply -f deployment.json # 所有的创建都是如此 kc apply -f service.json # 只有一个配置文件 kc create configmap conf-go-mod -f conf.json kc apply -f conf.json # 在 k8s 内是通过 service name + port 来访问的, 例如大多数的 golang 开启对外的 8080端口,用于http访问, 如 proxy-service:8080, 大多数的pulsar开启的是的 6650端口, 访问是 pulsar-service:6650。一个service 通过 spec.selector.app: apigate 来指明它的访问名, 这个 `apigate` 是 pod 内的 metadata.labels.app
拷贝 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 kubectl cp <some-namespace>/<some-pod>:/tmp/foo /tmp/bar kubectl cp test-ks/mongo-42-0:tmp/new_account.dat new_account.dat kubectl cp -c cloud-loan-gate uat/cloud-786d84c554-p7jz7:app/logs/app/cloud.log cloud.log uat:为namespace -c :指定容器(因pod中有多个container,默认从第一个,有可能报错找不到文件和目录) 源目录参数时,:后只能跟文件名,不能是以“/”开头的路径(eg:app/logs/cloud.log) 目标参数时,必须为文件不能是一个目录(eg:cloud.log) kubectl cp /tmp/foo <some-namespace>/<some-pod>:/tmp/bar kubectl cp new_account.dat test-kuaishou/mongo-42-0:/tmp/new_account.data
node node label 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 [root@tb-dev-agent21 test ] NAME STATUS ROLES AGE VERSION tb-dev-agent21 Ready master 68d v1.15.3 kubectl label nodes <node_name> key1=val1 key2=val2 kubectl label nodes tb-dev-agent21 ns-test-kuaishou="true" kubectl label nodes tb-dev-agent21 nodetype=qc kubectl get node --show-labels=true
参考 Kubernetes Labels 和 Selectors:http://docs.kubernetes.org.cn/247.html
参考:https://jimmysong.io/kubernetes-handbook/guide/kubectl-cheatsheet.html
https://cloud.tencent.com/developer/article/1140076