网站视频接口 怎么做,学网站开发怎么就业,辽宁建设银行企业银行官方网站,北京网站开发浩森宇特2、Controller
2.1、概述
在集群上管理和运行容器的对象#xff0c;控制器(也称为#xff1a;工作负载)#xff0c;Controller实际存在的#xff0c;Pod是抽象的#xff1b;
2.2、Pod和Controller关系
Pod是通过Controller实现应用运维#xff0c;比如#xff1a;弹…2、Controller
2.1、概述
在集群上管理和运行容器的对象控制器(也称为工作负载)Controller实际存在的Pod是抽象的
2.2、Pod和Controller关系
Pod是通过Controller实现应用运维比如弹性伸缩、滚动升级等等Pod和Controller之间通过labe和selectorl标签建立关系通过labels名称找到selector
2.3、常用控制器(deployment)
2.3.1、应用场景
部署无状态应用(例如:nginx)管理Pod和ReplicaSet部署滚动升级等功能应用场景web服务微服务
2.3.2、通过yaml文件部署应用
使用yaml文件部署应用 #创建并导出yaml文件kubectl create deployment nginx --imagenginx --dry-runclient -o yaml nginx.yaml#通过yaml文件部署应用kubectl apply -f nginx.yaml #查看状态kubectl get pod对外发布(暴露端口号)
#暴露端口号(target-port80)
kubectl expose deployment nginx --port80 --typeNodePort --target-port80 --name nginx -o yaml nginx1.yaml
#通过yaml文件暴露端口
kubectl apply -f nginx1.yaml 2.4、应用升级回滚和弹性伸缩
2.4.1、应用升级
升级过程中保证服务不中断会一个Pod一个Pod逐步替换升级实质image版本升级 1先指定应用版本部署这里指定nginx版本为1.14
#创建指定版本应用
kubectl apply -f nginx1.yaml 在Node节点查看镜像会看到下载的1.14版本 2应用升级此处nginx版本为1.15
#nginx:第一个表示名称,nginx第二个表示镜像
kubectl set image deployment nginx nginxnginx:1.15在Node节点查看镜像会看到下载的1.15版本 3查看升级状态
kubectl rollout status deployment nginx2.4.2、应用版本回滚
1查看历史版本
kubectl rollout history deployment nginx2回滚操作
回滚到上一个版本
#回滚到上一个版本
kubectl rollout undo deployment nginx
#查看回滚后状态
kubectl rollout status deployment nginx回滚到指定版本
#回滚到指定版本
kubectl rollout undo deployment nginx --to-revision22.4.3、应用弹性伸缩
#弹性伸缩命令
kubectl scale deployment nginx --replicas52.5、部署有状态应用(StatefulSet)
2.5.1、无状态和有状态
1无状态
认为Pod都是一样无顺序要求不用考虑在任意node运行可随意伸缩和控制 2有状态上面的因素都需要考虑到每个Pod都是独立的保持Pod启动顺序和唯一性唯一的网络标识符持久存储有序比如mysql主从
2.5.2、部署有状态应用
1SatefulSet部署有状态应用 无头service指ClusterIPnone。
无头的service
cat sts.yaml EOF
apiVersion: v1
kind: Service
metadata:creationTimestamp: nulllabels:app: nginxname: nginx
spec:ports:- port: 80name: webselector:app: nginxclusterIP: None---apiVersion: apps/v1
kind: StatefulSet
metadata:name: nginx-statefulsetnamespace: default
spec:serviceName: nginxreplicas: 3selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- image: nginx:latestname: nginxports:- containerPort: 80EOF查看pod: 有三个pod每个名称(NAME)都不一样查看创建无头ServiceCLUSTER-IPNone
#查看服务
kubectl get svc
#删除statefulset
kubectl delete statefulset --all2deployment和statefulset区别
statefulset特点 有唯一标识根据主机名 按照一定规则生成域名 每个pod有唯一主机名唯一域名格式主机名称.service名称.名称空间.svc.cluster.local nginx-statefulset-0.nginx.default.svc.cluster.local
2.6、部署守护进程(DaemonSet)
让每个node上运行同一个pod新加入的node也同样运行在一个pod里面 例如在每个node节点安装数据采集工具适用场景每台虚拟机(Node) 进行日志采集
创建daemonset文件
cat daemon.yaml EOF
apiVersion: apps/v1
kind: DaemonSet
metadata:name: ds-testlabels:app: filebeatnamespace: default
spec:selector:matchLabels:app: filebeattemplate:metadata:labels:app: filebeatspec:containers:- name: logsimage: nginxports:- containerPort: 80volumeMounts:- name: varlogmountPath: /tmp/logvolumes:- name: varloghostPath:path: /var/logEOF创建守护进程pod
#执行daemon.yaml文件
kubectl apply -f deamon.yaml
kubectl get pods进入容器查看日志
kubectl get pods
#进入容器
kubectl exec -it ds-test-bg657 bash
#查看日志
ls /tmp/log
#退出
exit2.6、一次性任务和定时任务
2.6.1、Job(一次性任务)
创建job.yaml文件
#创建job文件计算PI的值
cat job.yaml EOF
apiVersion: batch/v1
kind: Job
metadata:name: pi-calculatenamespace: default
spec:template:spec:containers:- name: piimage: perlcommand: [perl, -Mbignumbpi, -wle, print bpi(2000)]restartPolicy: NeverbackoffLimit: 4EOF创建job
#创建job应用yaml文件
$kubectl apply -f job.yaml
#Node: 【Completed】表示一次性任务完成
$kubectl get pods -o wide
#查看一次性job
$kubectl get jobs
#查看日志: 格式: kubectl logs pod名称
$kubectl logs pi-calculate-dgxtr
#删除job
$kubectl delete -f job.yaml2.6.2、CornJob(定时任务)
创建cronjob.yaml文件
cat cronjob.yaml EOF
apiVersion: batch/v1beta1
kind: CronJob
metadata:name: hello-worldnamespace: default
spec:schedule: */1 * * * *jobTemplate:spec:template:spec:containers:- name: hello-worldimage: busyboxargs:- /bin/sh- -c- date; echo Hello from the kubernetesrestartPolicy: OnFailureEOF创建cronjob
#创建cronjob应用yaml文件
$kubectl apply -f cronjob.yaml
#Node: 【Completed】表示一次性任务完成,此处会定时输出
$kubectl get pods -o wide
#查看一次性job
$kubectl get cronjobs
#查看日志: 格式: kubectl logs pod名称
$kubectl logs hello-world-1624xxx
#删除job
$kubectl delete -f cronjob.yaml4、配置管理
4.1、Secret
作用存储加密数据到etcd让Pod容器以变量或者挂载Volume方式进行访问数据适用场景凭证(认证)。 1创建secret加密数据
base64 编码用户名或密码
#编码base64
echo -n admin | base64创建加密数据文件
cat secret.yaml EOF
apiVersion: v1
kind: Secret
metadata:name: mysecret
type: Opaque
data:username: YWRtaW4 password: MWYyZDF1MmU2N2Rm EOF生成加密数据
$kubectl create -f secret.yaml
#获取加密数据,注此处加密名称为mysecret
$kubectl get secret
#辅助命令kubectl delete secret --all (删除secret)2以变量方式挂载到Pod容器中
创建带有加密的pod yaml文件 环境变量名称分别为SECRET_USERNAMESECRET_PASSWORD 加密名称(name)mysecret和(1)中mysecret要相同
cat secret-val.yaml EOF
apiVersion: v1
kind: Pod
metadata:name: mypod
spec:containers:- name: nginximage: nginxenv: - name: SECRET_USERNAMEvalueFrom: secretKeyRef:name: mysecretkey: username- name: SECRET_PASSWORDvalueFrom:secretKeyRef:name: mysecretkey: password
EOF创建pod并访问加密数据
$kubectl apply -f secret-val.yaml
$kubectl get pods
#进入pod
$kubectl exec -it mypod bash
#查看环境变量
echo $SECRET_USERNAME
echo $SECRET_PASSWORD3以Volume方式挂载到Pod容器中
创建带有加密的pod yaml文件 加密名称(secretName)mysecret和(1)中mysecret要相同 挂载目录(mountPath)容器/etc/foo目录
cat secret-vol.yaml EOF
apiVersion: v1
kind: Pod
metadata:name: myfoo
spec:containers:- name: nginximage: nginxvolumeMounts:- name: foomountPath: /etc/foovolumes:- name: foosecret:secretName: mysecret
EOF创建pod并访问加密数据
$kubectl apply -f secret-vol.yaml
$kubectl get pods
#进入pod
$kubectl exec -it myfoo bash
#进入目录
ls /etc/foo
cd /etc/foo
#查看文件
cat password
cat username4.2、ConfigMap
作用存储不加密数据到etcd让Pod容器以变量或者挂载Volume方式进行访问数据适用场景配置文件(IP、端口号、不加密的用户名和密码)。
4.2.1、挂载Volume方式访问
1创建配置文件
cat redis.properties EOF
redis.host127.0.0.1
redis.port6379
redis.password123456EOF2创建configmap(名称:redis-config)
#从配置文件创建configmap
$kubectl create configmap redis-config --from-fileredis.properties
#获取cm(configmap)
$kubectl get cm
#查看cm(configmap)
$kubectl describe cm redis-config
#辅助命令kubectl delete cm --all 删除所有cm4以Volume方式挂载到Pod容器
创建cmpod yaml文件 mountPath将上面redis.properties文件挂载到/etc/config目录 command输入redis.properties信息 name名称redis-config
cat cm.yaml EOF
apiVersion: v1
kind: Pod
metadata:name: cmpod
spec:containers:- name: busyboximage: busyboxcommand: [/bin/sh, -c, cat /etc/config/redis.properties]volumeMounts:- name: config-volumemountPath: /etc/configvolumes:- name: config-volumeconfigMap:name: redis-configrestartPolicy: NeverEOF创建pod以volume挂载并输出配置
$kubectl apply -f cm.yaml
$kubectl get pods
#查看日志Completed状态只能以查看日志方式不能进入容器
$kubectl logs cmpod4.2.2、变量方式访问
1以变量方式挂载到Pod容器
创建cm yaml文件 变量名称为special.levelspecial.type kind类型为ConfigMap name名称为cmconfig
cat cmconfig.yaml EOF
apiVersion: v1
kind: ConfigMap
metadata:name: cmconfignamespace: default
data:special.level: infospecial.type: helloEOF生成cm(configMap) 创建pod以变量挂载并输出配置 name名称为上面cmconfig key为上面定义变量special.level、special.info
cat cmconfig-var.yaml EOF
apiVersion: v1
kind: Pod
metadata:name: cmvarpod
spec:containers:- name: busyboximage: busyboxcommand: [/bin/sh, -c, echo $(LEVEL) $(TYPE)]env:- name: LEVELvalueFrom:configMapKeyRef:name: cmconfigkey: special.level- name: TYPEvalueFrom:configMapKeyRef:name: cmconfigkey: special.typerestartPolicy: Never
EOF输出变量special.level和special.type值
5、集群安全机制
5.1、概述
1访问K8s集群资源的时候需要经过三个步骤完成具体操作
认证 传输安全对外不暴露8080端口只能内部访问对外使用端口6443 认证方式(客户端身份认证常用方式) https证书认证基于ca证书 http token认证通过token识别用户 http基本认证用户名密码认证使用较少 鉴权(授权) 基于RBAC进行鉴权操作(基于角色访问控制)准入控制 就是准入控制器的列表如果列表中找到请求内容则通过没有拒绝 2访问集群时候都需要经过apiserverapiserver做统一协调类似门卫职责在访问过程中需要证书、token、或者用户名密码进行相关操作和授权如果访问Pod还需要serviceAccount。
5.2、RBAC
基于角色的访问控制 1角色
role针对特定的命名空间访问权限ClusterRole针对所有命名空间访问权限
2角色绑定
roleBinding角色绑定到主体ClusterRoleBinding集群角色绑定到主体
3主体
user用户group用户组serviceaccount服务账号(一般用于pod访问)
5.3、RBAC实现鉴权
5.3.1、创建命名空间
#查看命名空间
$kubectl get ns
#创建命名空间,名称为roledemo
$kubectl create ns roledemo2在新创建的命名空间创建pod
#在namespace(roledemo)下创建pod
$kubectl run nginx --imagenginx -n roledemo
#查看指定命名空间下pod
$kubectl get pods -n roledemo3创建角色
cat rbac-role.yaml EOF
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:name: pod-readernamespace: roledemo
rules:
- apiGroups: [] # indicates the core API groupresources: [pods]verbs: [get, watch, list]EOF#在命名空间中创建角色
$kubectl apply -f rbac-role.yaml
#查看命名空间下角色
$kubectl get role -n roledemo
#辅助命令kubectl get role 查看所有命名空间角色4创建角色绑定
cat rbac-rolebinding.yaml EOF
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:name: read-podsnamespace: roledemo
subjects:
- kind: Username: [pods]verbs: [get, watch, list]EOF