Kubelet组件运行在Node节点上,维持运行中的Pods以及提供kuberntes运行时环境,主要完成以下使命:
1.监视分配给该Node节点的pods
2.挂载pod所需要的volumes
3.下载pod的secret
4.通过docker/rkt来运行pod中的容器
5.周期的执行pod中为容器定义的liveness探针
6.上报pod的状态给系统的其他组件
7.上报Node的状态
### 1、签发证书
签发证书 kubelet也对外提供https服务,apiserver主动找 kubelet问节点的一些信息,所以kubelet需要给自己签发server 证书, 而且server 证书还的列出 kubelet可能用到的所有节点,不能写IP段,如果要后加:重新签发新的证书,以前的节点不需要动,新的证书给新的机节点用,随后重启服务,但是这时候又两套证书 。
所以:以前的节点在流量低谷的时候,更新证书 ,然后节点重启
```
vi /opt/certs/kubelet-csr.json
{
"CN": "k8s-kubelet",
"hosts": [
"127.0.0.1",
"10.4.7.10",
"10.4.7.21",
"10.4.7.22",
"10.4.7.23",
"10.4.7.24",
"10.4.7.25",
"10.4.7.26",
"10.4.7.27",
"10.4.7.28"
],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "beijing",
"L": "beijing",
"O": "od",
"OU": "ops"
}
]
}
```
#### 生成证书
```
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=server kubelet-csr.json | cfssl-json -bare kubelet
```
#### 将证书发送到3台 kubelet机器上
```
scp kubelet.pem kubelet-key.pem HDSS7-21:/opt/kubernetes/server/bin/cert/
```
#### **set-cluster**
注意:在conf目录下:
cd /opt/kubernetes/server/bin/conf
```
kubectl config set-cluster myk8s \
--certificate-authority=/opt/kubernetes/server/bin/cert/ca.pem \
--embed-certs=true \
--server=https://10.4.7.10:7443 \
--kubeconfig=kubelet.kubeconfig
解释:
kubectl config set-cluster myk8s \
--certificate-authority=/opt/kubernetes/server/bin/cert/ca.pem \ 根证书ca指进来
--embed-certs=true \ 承载式证书
--server=https://192.168.206.70:7443 \ 指server=vip
--kubeconfig=kubelet.kubeconfig
目的是要给kubectl做一个k8s用户,k8s客户体系很复杂,有普通、特殊等用户,这里是普通用户,要跟spiserver通信的时候要有一个接入点,接入点就是https://192.168.206.70:7443
```
#### **set-credentials**
创建用户账号,即用户登陆使用的客户端私有和证书,可以创建多个证书
```
kubectl config set-credentials k8s-node \
--client-certificate=/opt/kubernetes/server/bin/cert/client.pem \
--client-key=/opt/kubernetes/server/bin/cert/client-key.pem \
--embed-certs=true \
--kubeconfig=kubelet.kubeconfig
解释:
kubectl config set-credentials k8s-node \
--client-certificate=/opt/kubernetes/server/bin/cert/client.pem \ 把client.pem放进来
--client-key=/opt/kubernetes/server/bin/cert/client-key.pem \ 把client-key.pem 放进来
--embed-certs=true \
--kubeconfig=kubelet.kubeconfig
把client.pem 、client-key.pem 放进来,说明我要跟apiuserver 通信,这时候spiserver 是我的服务端,我要拿客户端的你要要跟你通信,kubectl作为客户端。
```
#### **set-context**
设置context,即确定账号和集群对应关系
```
kubectl config set-context myk8s-context \
--cluster=myk8s \
--user=k8s-node \
--kubeconfig=kubelet.kubeconfig
解释:
kubectl config set-context myk8s-context \
--cluster=myk8s \
--user=k8s-node \ 指定了一个user=k8s-node
--kubeconfig=kubelet.kubeconfig
```
#### **use-context**
设置当前使用哪个context
```
kubectl config use-context myk8s-context --kubeconfig=kubelet.kubeconfig
解释:
kubectl config use-context myk8s-context --kubeconfig=kubelet.kubeconfig 切换到k8s-node
```
### 2、授权k8s-node用户
给name: k8s-node 授一个权限,利用rbac规则让他具有集群里面成为节点的权限
此步骤只需要在一台master节点执行(因为这两个节点,只要创建一次,他已经进入k8s,已经落入到etcd里面,无论在那个节点执行,他都已经把资源创建出来,因此需要在一台master节点执行)
授权 k8s-node 用户绑定集群角色 system:node ,让 k8s-node 成为具备运算节点的权限。
hdss-73 上执行: 我创建了一个k8s用户k8s-node,给k8s-node用户,授予集群权限,让他具备运算节点的节点的权限
```
cd /opt/kubernetes/server/bin/conf
vi k8s-node.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: k8s-node
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: system:node
subjects:
- apiGroup: rbac.authorization.k8s.io
kind: User
name: k8s-node
解释:
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: k8s-node
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole 做了一个集群角色绑定,让kind:User 中name:k8s-node这个用户,具备集群角色,这个集群角色叫system:node
name: system:node
subjects:
- apiGroup: rbac.authorization.k8s.io
kind: User
name: k8s-node
资源:rbac建立权限也是一种资源,大致有apiVsersion、kind、metadata(元数据)下有名称name、roleRef、subjects
```
启动yaml文件
```
kubectl create -f k8s-node.yaml
kubectl get clusterrolebinding k8s-node
kubectl get clusterrolebinding k8s-node -o yaml
```
![](https://img.kancloud.cn/99/d9/99d9d7bc53164eb1ed2eff2a21a7320f_820x389.png)
#### 建kubelet.kubeconfig证书复制到其他两个节点
k8s-node.yaml 资源创建一次就行,他会自动把资源加载到etcd中,我们可以把他拷到其他节点
```
scp kubelet.kubeconfig HDSS7-22:/opt/kubernetes/server/bin/conf/
scp kubelet.kubeconfig HDSS7-23:/opt/kubernetes/server/bin/conf/
```
3、装备pause镜像
kubectl在启动的时候,需要一个基础镜像,帮助我们启动pod,kubectl:接收请求把pod拉起来。kubectl 原理是他去调度docker,让docker引擎把容器真正拉起来,但是拉时候必须有一个基础镜像,基础镜像干什么:便车模式,一个小镜像,让kubectl 控制这个这个小镜像。先于我们业务容器起来,让他帮助我们给业务容器设置uts、nat、ipc, 他会先把命名空间占上,也就是业务容器还没有起来,我们的pod ip已经分配出来
**将pause镜像放入到harbor私有仓库中:**
```
docker pull kubernetes/pause
docker tag f9d5de079539 harbor.od.com/public/pause:latest
docker push harbor.od.com/public/pause:latest
```
![](https://img.kancloud.cn/72/5c/725c8ce5b87610706fb067e153a1ed00_2015x660.png)
### 4、创建kubelet启动脚本
在node节点创建脚本并启动kubelet
```
vi /opt/kubernetes/server/bin/kubelet.sh
#!/bin/sh
./kubelet \
--anonymous-auth=false \
--cgroup-driver systemd \
--cluster-dns 192.168.0.2 \
--cluster-domain cluster.local \
--runtime-cgroups=/systemd/system.slice \
--kubelet-cgroups=/systemd/system.slice \
--fail-swap-on="false" \
--client-ca-file ./cert/ca.pem \
--tls-cert-file ./cert/kubelet.pem \
--tls-private-key-file ./cert/kubelet-key.pem \
--hostname-override hdss7-21.host.com \
--image-gc-high-threshold 20 \
--image-gc-low-threshold 10 \
--kubeconfig ./conf/kubelet.kubeconfig \
--log-dir /data/logs/kubernetes/kube-kubelet \
--pod-infra-container-image harbor.od.com/public/pause:latest \
--root-dir /data/kubelet
```
#### 创建目录和授权
```
chmod u+x /opt/kubernetes/server/bin/kubelet.sh
mkdir -p /data/logs/kubernetes/kube-kubelet
```
#### 创建配置文件
```
vi /etc/supervisord.d/kube-kubelet.ini
[program:kube-kubelet]
command=/opt/kubernetes/server/bin/kubelet.sh ; the program (relative uses PATH, can take args)
numprocs=1 ; number of processes copies to start (def 1)
directory=/opt/kubernetes/server/bin ; directory to cwd to before exec (def no cwd)
autostart=true ; start at supervisord start (default: true)
autorestart=true ; retstart at unexpected quit (default: true)
startsecs=30 ; number of secs prog must stay running (def. 1)
startretries=3 ; max # of serial start failures (default 3)
exitcodes=0,2 ; 'expected' exit codes for process (default 0,2)
stopsignal=QUIT ; signal used to kill process (default TERM)
stopwaitsecs=10 ; max num secs to wait b4 SIGKILL (default 10)
user=root ; setuid to this UNIX account to run the program
redirect_stderr=true ; redirect proc stderr to stdout (default false)
stdout_logfile=/data/logs/kubernetes/kube-kubelet/kubelet.stdout.log ; stderr log path, NONE for none; default AUTO
stdout_logfile_maxbytes=64MB ; max # logfile bytes b4 rotation (default 50MB)
stdout_logfile_backups=4 ; # of stdout logfile backups (default 10)
stdout_capture_maxbytes=1MB ; number of bytes in 'capturemode' (default 0)
stdout_events_enabled=false ; emit events on stdout writes (default false)
```
#### 更新配置查看服务启动情况
```
supervisorctl update
supervisorctl status
```
#### 查看node节点是否加到节点里面:
```
[root@hdss7-21 etcd]# kubectl get node
NAME STATUS ROLES AGE VERSION
hdss7-21.host.com Ready <none> 29h v1.15.4
hdss7-22.host.com Ready <none> 29h v1.15.4
hdss7-23.host.com Ready <none> 28h v1.15.4
```
### 5、修改节点角色(只是打标签,好看)
过滤相应的节点:假如生产环境,可以主控节点跟node运算节点物理分开部署、比如:主控节点除了部署apiserver,还有controller-manager、kube-scheduler都用容器镜像的方式托管到K8S,也装了kubectl ,不想主控节点运行业务节点,这时候用到标签选择器,给主控选择器打一个污点,让别的镜像不能容忍这个。
```
[root@hdss7-21 etcd]# kubectl get node
NAME STATUS ROLES AGE VERSION
hdss7-21.host.com Ready <none> 29h v1.15.4
hdss7-22.host.com Ready <none> 29h v1.15.4
hdss7-23.host.com Ready <none> 28h v1.15.4
使用 kubectl get nodes 获取的Node节点角色为空,可以按照以下方式修改:
kubectl label node hdss7-21.host.com node-role.kubernetes.io/master=
kubectl label node hdss7-23.host.com node-role.kubernetes.io/node=
[root@hdss7-21 etcd]# kubectl get node
NAME STATUS ROLES AGE VERSION
hdss7-21.host.com Ready master 29h v1.15.4
hdss7-22.host.com Ready master 29h v1.15.4
hdss7-23.host.com Ready node 28h v1.15.4
```
- 空白目录
- k8s
- k8s介绍和架构图
- 硬件环境和准备工作
- bind9-DNS服务部署
- 私有仓库harbor部署
- k8s-etcd部署
- api-server部署
- 配置apiserver L4代理
- controller-manager部署
- kube-scheduler部署
- node节点kubelet 部署
- node节点kube-proxy部署
- cfss-certinfo使用
- k8s网络-Flannel部署
- k8s网络优化
- CoreDNS部署
- k8s服务暴露之ingress
- 常用命令记录
- k8s-部署dashboard服务
- K8S平滑升级
- k8s服务交付
- k8s交付dubbo服务
- 服务架构图
- zookeeper服务部署
- Jenkins服务+共享存储nfs部署
- 安装配置maven和java运行时环境的底包镜像
- 使用blue ocean流水线构建镜像
- K8S生态--交付prometheus监控
- 介绍
- 部署4个exporter
- 部署prometheus server
- 部署grafana
- alert告警部署
- 日志收集ELK
- 制作Tomcat镜像
- 部署ElasticSearch
- 部署kafka和kafka-manager
- filebeat镜像制作
- 部署logstash
- 部署Kibana
- Apollo交付到Kubernetes集群
- Apollo简介
- 交付apollo-configservice
- 交付apollo-adminservice
- 交付apollo-portal
- k8s-CICD
- 集群整体架构
- 集群安装
- harbor仓库和nfs部署
- nginx-ingress-controller服务部署
- gitlab服务部署
- gitlab服务优化
- gitlab-runner部署
- dind服务部署
- CICD自动化服务devops演示
- k8s上服务日志收集