0%

虚拟化之开始使用 k8s【1】

[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
# kubectl replace -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
# config map
kc get configmaps
kc get cm
# pods
kc get pods
kc get pod

#资源详情
# -o yaml 以 yaml 格式显示
# -o json 以 JSON 格式显示
# 部署配置
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
# 同 get, 只是 动词换为了 delete

# 删除服务
kc delete svc sdk-tb-service
kc delete deploy deploy-sdk-tb-api

# 强制删除pod
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
# 拷贝资源, 注意pb.gz 这种文件好像无法拷贝
# 从pod 拷贝出来
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]# kubectl get nodes
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

# https://blog.csdn.net/kozazyh/article/details/88587012

参考

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