节点管家: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
,指定的就是kubelet
的kubeconfig
文件,用来访问apiserver
使用的pod-manifest-path
,就是静态pod
的manifest
路径,在master
中,存放了master
组件的静态pod
的yaml
文件,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
APIServer
的pod 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-port
是api-server
的非安全服务端口,默认使用http
协议访问,默认值为0
,即不开启service-account-key-file
是server-account
的公钥文件,用于验证客户端请求中的service-account
中的token
串的,若没有设置,则apiserver
会使用tls-private-key-file
来验证token
串kubelet-client-key
设置的是apiserver
以client
端身份,访问kubernetes
所使用的私钥文件admission-control
设置的是一组准入策略的拦截器service-cluster-ip-range
设置的是抽象的kubernetes-servers
的无类别遇见路由地址分配范围,不能与pod
的范围有交集kubelet-client-certificate
设置的是apiserver
以client
端身份访问kubernetes
的数字公钥证书allow-privileged
,配置是否允许启动特权容器client-ca-file
,是用于对client
请求进行证书校验的ca
公钥证书tls-cert-file
,是apiserver
的公钥证书tls-private-key-file
,是apiserver
的私钥证书secure-port
是apiserver
的端口advertise-address
是apiserver
的地址authorization-mode=Node
是设置用户授权模式列表- 最下面的
etcd
则是用来配置apiserver
与etcd
之前的相关文件
kubelet
监听/etc/kubernetes/manifests
目录变化,自动重启配置发生变化的apiserver pod
配置中心:etcd
etcd
:
- 位置在
/etc/kubernetes/manifests
下的etcd.yaml
- 由
kubelet
启动的static pod
apiserver
与etcd
之间采用基于TLS
的安全通信etcd
挂载master
节点本地路径/var/lib/etcd
用于运行时数据存储
要是做
etcd
的数据迁移,需要关注这个目录/var/lib/etcd
管理控制中心:kube-controller-manager
Controller-manager
:
- 负责集群内
Node
、Pod
副本、服务的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-proxy
由daemonse
控制器在各个节点上启动唯一实例- 配置参数:
/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
入口,如果已存在,那么会做字段的合并。创建一个名为master
的cluster
$ 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
入口,存在的话,会覆盖,创建一个context
是admin1@k8s1
,关联的user
是admin1
$ 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>
本文作者为olei,转载请注明。
一脸懵逼的进来,一脸懵逼的离开~[aru_19]
@楚狂人博客虽然我这么写了,很多我也挺懵逼的[aru_24]