kubectl 详解

olei 3,397 views 2

节点管家:kubelet

kubelet 运行在集群的所有节点上

  • 每个节点上的 kubelet 由操作系统的 init 进程 (如:systemd) 启动

ubuntu 16.04 +有两个,init 进程与文件分别是:

$ ls /lib/systemd/system/kubelet.service
-----------
/lib/systemd/system/kubelet.service

$ ls /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
-----------
/etc/systemd/system/kubelet.service.d/10-kubeadm.conf

kubelet 的主要参数配置在/etc/systemd/system/kubelet.service.d/10-kubeadm.conf 里面,查看一下

$ cat /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
-----------------------

[Service]
Environment="KUBELET_KUBECONFIG_ARGS=--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf"
Environment="KUBELET_SYSTEM_PODS_ARGS=--pod-manifest-path=/etc/kubernetes/manifests --allow-privileged=true"
Environment="KUBELET_NETWORK_ARGS=--network-plugin=cni --cni-conf-dir=/etc/cni/net.d --cni-bin-dir=/opt/cni/bin"
Environment="KUBELET_DNS_ARGS=--cluster-dns=10.96.0.10 --cluster-domain=cluster.local"
Environment="KUBELET_AUTHZ_ARGS=--authorization-mode=Webhook --client-ca-file=/etc/kubernetes/pki/ca.crt"
Environment="KUBELET_CADVISOR_ARGS=--cadvisor-port=0"
Environment="KUBELET_CERTIFICATE_ARGS=--rotate-certificates=true --cert-dir=/var/lib/kubelet/pki"
ExecStart=
ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_SYSTEM_PODS_ARGS $KUBELET_NETWORK_ARGS $KUBELET_DNS_ARGS $KUBELET_AUTHZ_ARGS $KUBELET_CADVISOR_ARGS $KUBELET_CERTIFICATE_ARGS $KUBELET_EXTRA_ARGS
  • bootstrap-kubeconfig,用于在 kubeconfig 的配置文件不存在的情况下,向 apiserver 获取 client 的证书文件和秘钥文件,获取后的证书文件以及秘钥文件,存储在 cert-dir 指定的目录下,即/var/lib/kubelet/pki 目录下,同时数据也会写入一份到 kubeconfig 指定的配置文件里面
  • kubeconfig,指定的就是 kubeletkubeconfig 文件,用来访问 apiserver 使用的
  • pod-manifest-path,就是静态 podmanifest 路径,在 master 中,存放了 master 组件的静态 podyaml 文件,kubelet 将负责启动这些静态 pod,并维持它们处于运行状态
  • KUBELET_NETWORK_ARGS,是与节点上 cni 网络插件相关的配置,kubelet 通过这些配置调用 cni 相关的程序,来配置 pod 中的容器网络
  • KUBELET_DNS_ARGS,是集群 dns 相关的配置
  • cadvisor-port,这里配置是 0,默认是 4194,配置为 0 是不在节点上开放 cadvisor 服务,cadvisor 是一个开源的容器资源使用率和性能的代理工具,默认情况下会在每一个节点上配置 agent,通过暴露 cadvisor-port 来提供服务,配置为 0 就是不在 node 上暴露 cadvisor-port 了,但 cadvisor 仍然运行在内部,可以通过节点 ip + 10250 端口来访问这个服务
  • 一般不用修改启动参数,要修改参数的话,只用修改上面的 kubeadm.conf 配置文件,修改之后生效
$ systemctl daemon-relod & systemctl restart kubelet

集群管理入口 kube-apiserver

kube-apiserver:

  • kubelet 启动的 static pod
  • APIServerpod spec/etc/kubernets/manifests/kube-apiserver.yaml

查看一下该配置文件

$ cat /etc/kubernets/manifests/kube-apiserver.yaml
-----------
...
containers:
  - command:
    - kube-apiserver
    - --client-ca-file=/etc/kubernetes/pki/ca.crt
    - --tls-cert-file=/etc/kubernetes/pki/apiserver.crt
    - --tls-private-key-file=/etc/kubernetes/pki/apiserver.key
    - --proxy-client-key-file=/etc/kubernetes/pki/front-proxy-client.key
    - --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname
    - --service-cluster-ip-range=10.96.0.0/12
    - --requestheader-username-headers=X-Remote-User
    - --requestheader-extra-headers-prefix=X-Remote-Extra-
    - --service-account-key-file=/etc/kubernetes/pki/sa.pub
    - --kubelet-client-certificate=/etc/kubernetes/pki/apiserver-kubelet-client.crt
    - --insecure-port=0
    - --admission-control=NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota
    - --requestheader-group-headers=X-Remote-Group
    - --requestheader-client-ca-file=/etc/kubernetes/pki/front-proxy-ca.crt
    - --requestheader-allowed-names=front-proxy-client
    - --advertise-address=xxxx
    - --kubelet-client-key=/etc/kubernetes/pki/apiserver-kubelet-client.key
    - --secure-port=6443
    - --proxy-client-cert-file=/etc/kubernetes/pki/front-proxy-client.crt
    - --enable-bootstrap-token-auth=true
    - --allow-privileged=true
    - --authorization-mode=Node,RBAC
    - --etcd-servers=https://127.0.0.1:2379
    - --etcd-cafile=/etc/kubernetes/pki/etcd/ca.crt
    - --etcd-certfile=/etc/kubernetes/pki/apiserver-etcd-client.crt
    - --etcd-keyfile=/etc/kubernetes/pki/apiserver-etcd-client.key
    image: k8s.gcr.io/kube-apiserver-amd64:v1.10.2
...
  • insecure-portapi-server 的非安全服务端口,默认使用 http 协议访问,默认值为 0,即不开启
  • service-account-key-fileserver-account 的公钥文件,用于验证客户端请求中的 service-account 中的 token 串的,若没有设置,则 apiserver 会使用 tls-private-key-file 来验证 token
  • kubelet-client-key 设置的是 apiserverclient 端身份,访问 kubernetes 所使用的私钥文件
  • admission-control 设置的是一组准入策略的拦截器
  • service-cluster-ip-range 设置的是抽象的 kubernetes-servers 的无类别遇见路由地址分配范围,不能与 pod 的范围有交集
  • kubelet-client-certificate 设置的是 apiserverclient 端身份访问 kubernetes 的数字公钥证书
  • allow-privileged,配置是否允许启动特权容器
  • client-ca-file,是用于对 client 请求进行证书校验的 ca 公钥证书
  • tls-cert-file,是 apiserver 的公钥证书
  • tls-private-key-file,是 apiserver 的私钥证书
  • secure-portapiserver 的端口
  • advertise-addressapiserver 的地址
  • authorization-mode=Node 是设置用户授权模式列表
  • 最下面的 etcd 则是用来配置 apiserveretcd 之前的相关文件
  • kubelet 监听/etc/kubernetes/manifests 目录变化,自动重启配置发生变化的 apiserver pod

配置中心:etcd

etcd

  • 位置在/etc/kubernetes/manifests 下的 etcd.yaml
  • kubelet 启动的 static pod
  • apiserveretcd 之间采用基于 TLS 的安全通信
  • etcd 挂载 master 节点本地路径/var/lib/etcd 用于运行时数据存储

要是做 etcd 的数据迁移,需要关注这个目录/var/lib/etcd

管理控制中心:kube-controller-manager

Controller-manager

  • 负责集群内 NodePod 副本、服务的 endpoit、命名空间、Service Account、资源配额等管理
  • kubelet 启动的 static pod
  • 文件是在/etc/kubernetes/manifests 中的 kube-controller-manager.yaml,修改方式就修改这个文件,然后会自动重启生效

调度器 kube-scheduler

Scheduler:单纯地调度 Pod

  • 按照特定的调度算法和策略,将待调度的 Pod 绑定到集群中某个合适的 Node,并写入绑定信息
  • kubelet 启动 static pod
  • 位置在/etc/kubernetes/manifests 中的 kube-scheduler.yaml

服务抽象实现 kube-proxy

kube-proxy 运行在 kubernetes 集群的每一个节点上

  • kube-proxydaemonse 控制器在各个节点上启动唯一实例
  • 配置参数:/var/lib/kube-proxy/config.cong(pod 内)
  • 查看,我的 k8s1 的是:kube-proxy-vjr5c
$ kubectl exec kube-proxy-vjr5c -n kube-system -- cat /var/lib/kube-proxy/config.conf

-----------------

apiVersion: kubeproxy.config.k8s.io/v1alpha1
bindAddress: 0.0.0.0
clientConnection:
  acceptContentTypes: ""
  burst: 10
  contentType: application/vnd.kubernetes.protobuf
  kubeconfig: /var/lib/kube-proxy/kubeconfig.conf
  qps: 5
clusterCIDR: 192.168.16.0/20
configSyncPeriod: 15m0s
conntrack:
  max: null
  maxPerCore: 32768
  min: 131072
  tcpCloseWaitTimeout: 1h0m0s
  tcpEstablishedTimeout: 24h0m0s
enableProfiling: false
healthzBindAddress: 0.0.0.0:10256
hostnameOverride: ""
iptables:
  masqueradeAll: false
  masqueradeBit: 14
  minSyncPeriod: 0s
  syncPeriod: 30s
ipvs:
  minSyncPeriod: 0s
  scheduler: ""
  syncPeriod: 30s
kind: KubeProxyConfiguration
metricsBindAddress: 127.0.0.1:10249
mode: ""
nodePortAddresses: null
oomScoreAdj: -999
portRange: ""
resourceContainer: /kube-proxy
udpIdleTimeout: 250ms

mode 为空,则为选择目前最好的 mode,目前是 iptables

  • Proxy mode:目前是:iptables

集群管理工具:kubectl

kubectl 是目前管理 k8s 集群的最强利器

  • 集群访问控制命令 kubectl config
  • 查看当前节点下 kube config 的内容
$ kubectl config view
-----------------------
apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: REDACTED
    server: https://xxxxx:6443
  name: kubernetes
contexts:
- context:
    cluster: kubernetes
    user: kubernetes-admin
  name: kubernetes-admin@kubernetes
current-context: kubernetes-admin@kubernetes
kind: Config
preferences: {}
users:
- name: kubernetes-admin
  user:
    client-certificate-data: REDACTED
    client-key-data: REDACTED

可以看到隐去了私钥公钥的内容

  • 另一个
$ kubectl config set-cluster

在当前的 kube-config 文件中创建一个 cluster 入口,如果已存在,那么会做字段的合并。创建一个名为 mastercluster

$ kubectl config set-cluster master --server=https://1.2.3.4
  • 通过 kubectl config set-clusters 命令,来查看当前 kube config 文件中配置的所有 cluster
$ kubectl config get-clusters
-------------------
NAME
master
kubernetes
  • 删除 cluster
$ kubectl config delete-cluster master
---------------------
deleted cluster master from /etc/kubernetes/admin.conf
  • 另一个
$ kubectl config set-context

会在 config 文件中创建一个 context 入口,存在的话,会覆盖,创建一个 contextadmin1@k8s1,关联的 useradmin1

$ kubectl config set-context admin1@k8s1 --user=admin1
--------------------
Context "admin1@k8s1" created.
  • 获取当前所有的 context
$ kubectl config get-contexts
--------------------
CURRENT   NAME                          CLUSTER      AUTHINFO           NAMESPACE
          admin1@k8s1                                admin1
*         kubernetes-admin@kubernetes   kubernetes   kubernetes-admin
  • 查看当前所使用的 kube-context
$ kubectl config current-context
---------------------
kubernetes-admin@kubernetes
  • 设置使用哪个 context
$ kubectl config use-context <context-name>
  • 删除 context
$ kubectl config delete-context <context-name>
  • 另一个,在 config 中创建一个 user 记录,存在即覆盖
$ kubectl config set-credentials admin1 --username=admin --password=abcdef
  • 查看当时添加
$ kubectl config view
  • 集群的控制命令:kubectl create/apply/delete/label/edit/expose/scale
  • 创建
$ kubectl create -f xxx.yaml
  • 打标签
$ kubectl lable pods/<pod-name>  <pod-lable>
  • 查询标签
$ kubectl get pods --show-lables | grep <%pod-name%>
  • 编辑 pod 的配置 yaml 文件
$ kubeclt edit deployment/<pod-name>
  • pod 副本数升到 3
$ kubectl scale --replicas=3 deployment/<%pod-name%>

其中<pod-name><xx-xx>

  • 恢复原始数据
$ kubectl apply -f xxx.yaml
  • 删除 deployment
$ kubectl delete -f xxx.yaml
  • 集群查看跟问题调试命令:kubectl get/describe/logs/exec/attach
  • 查看 pod
$ kubectl get pods < 参数>
  • 查看 pod 运行的信息
$ kubectl describe pods/<pod-name>
  • 查看 log 日志
$ kubectl logs -f pods/<pod-name>
  • 访问容器内部,例如查看容器内/xxx/xxx/xxx.conf 的内容
$ kubectl exec <pod-name> -- cat /xxx/xxx/xxx.conf
  • 挂在到容器中
$ kubectl attach <pod-name>

发表评论 取消回复
表情 图片 链接 代码

  1. 楚狂人博客
    楚狂人博客 Lv 1

    一脸懵逼的进来,一脸懵逼的离开~[aru_19]

    • olei
      olei 站长

      @楚狂人博客虽然我这么写了,很多我也挺懵逼的 [aru_24]

分享