k8s常用命令与样例模板-sicc的学习之路
Posted Sicc1107
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了k8s常用命令与样例模板-sicc的学习之路相关的知识,希望对你有一定的参考价值。
一常用命令
kubectl create deployment web --image=nginx
kubectl get pods -o wide
kubectl scale deployment web --replicas=5
kubectl create deployment web --image=nginx --dry-run -o yaml > web.yaml
kubectl apply -f web.yaml
kubectl expose deployment web --port=80 --type=NodePort --target-port=80 --name=web1 -o yaml > web1.yaml
kubectl exec -it podename bash
kubectl --help #查看帮助操作
kubectl cluster-info #查看集群状态
kubectl get cs #查看集群状态
kubectl get nodes #查看节点状态
kubectl get ns #查看所有命名空间
kubectl pods -n 命名空格 # 查看指定命名空间内的pods
kubectl pods --all-namespaces #查看所有 命名空间 所有pods
kubectl get pod,svc --all-namespaces
kubectl get pod -o wide -n kubernetes-dashboard
kubectl get all -o wide --all-namespaces #查看所有命名空间下的所有信息
#label
kubectl label node nodename key=value #给node节点标注一个label
kubectl label node node1 env_role=prod
#比如执行如下命令标注k8s-node1是配置了SSD的节点。
kubectl label node k8s-node1 disktype=ssd
#然后通过kubectl get node --show-labels查看节点
kubectl label node nodename key- #把node节点的label:key删除掉
kubectl get node --show-labels #查看一个node节点的标签信息
kubectl get node --show-labels #获取node上的label信息;
kubectl get nodes node1 --show-labels
kubectl get deployment --all-namespaces #是可以查看到所有的namespace下的pods信息
kubectl get svc -n ns-2
#日志类命令
kubectl logs pod-name #查看容器中输出的日志;
kubectl logs -f podname -c containername #跟踪查看下具体容器的日志,相当于是tail -f
kubectl exec pod-name cmd: #---在podname中执行cmd命令,该命令用‘’扩好;
kubectl exec pod-name -c containername 命令: #---在podname中的容器containername中执行命令
kubectl exec -it common-1-controller-786c6c76dd-lqzc8 -c common-0 /bin/sh -n ns-2 # 进入pod
#查看资源占用情况
kubectl top node
kubectl top pod -n ns-222222
kubectl api-resources
kubectl describe node 10.19.10.25 #获取所有node的信息
kubectl get pods -A -o wide |grep nodeip #查看一台node主机上的所有pod资源
kubectl top nodes
kubectl top pods -n kube-system
kubectl get ingresses -n ns-yancheng
kubectl get storageclass -n ns-yancheng
Pod
1 最小部署单元
2 包含多个容器(一组容器的组合)
3 一个是通过共享网络,共享存储实现,共享命名空间
4 Pod是短暂的
一个pod 有多个容器,一个容器里面运行一个应用程序
Pod是为了亲模型应用产生的,两个需要频繁调用的两个应用
1 程序之后的交换
2 网络之间的交换
pod实现机制网络共享,共享存储
容器本身隔离 使用namespace 和group 进行隔离
多个容器,多个业务 在同一个namespace下
apiVersion: v1
kind: Pod
metadata:
name: mypod1
space:
containers:
- name: write
image: centos
command: ["bash", "-c","for i in (1..100);do echo $i >>/data/hello;sleep 1 ;done"]
volumeMounts: #挂载数据卷
- name: date
mountPath: /date
- name: read
image: centos
command: ["bash", "-c","tail -f /data/hello"]
volumeMounts: #挂载数据卷
- name: date
mountPath: /date
vlumes: #引入数据卷的概念,使用数据卷进行持久化存储
- name: data
emptyDir:
镜像的拉取策略
apiVersion: v1
kind: Pod
metadata:
name: mypod2
space:
containers:
- name: nginx
image: nginx:1.14
imagePullPolicy: Always
#IfNotPresent 默认值,镜像在宿主机上不存在时才拉取
#Always 每次创建Pod都会重新拉取一层镜像
#Never Pod永远不会主动拉取这个镜像
Pod资源限制
apiVersion: v1
Kind: Pod
metadate:
name: forntend
spec:
containers:
- name: db
image: mysql
env:
- name: MYSQL_ROOT_PASSWORD
value: "password"
resources:
requets: #pod调度大小
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi" #最大的大小 1cpu = 1000m
cpu: "500m"
restartPolicy: Never #Pod重启策略
Pod重启策略
apiVersion: V1
Kind: Pod
metadata:
name: mypod3
spec:
containers:
- name: busybox
image: busybox:1.20.4
args:
- /bin/sh
- -c
- sleep 3600
restartPolicy: Never #Pod重启策略
Always:当容器终止退出后,总时重启容器,默认策略
OnFailure:当容器异常退出(退出状态码非0)时,才重启容器
Never:当容器终止退出,从不重启容器
Pod健康检查
java堆内存溢出
容器检查
apiVersion: v1
kind: pod
metadata:
labels:
test: liveness
name: liveness-exec
spec:
containes:
- name: livebess
images: busybox
args:
- /bin/sh
- -c
- touch /tmp/healthy; sleep 30;rm -rf /tmp/healthy
livenessProbe: #存活策略
exec:
command:
- cat
- /tmp/healthy
initialDelaySeconds: 5
periodSeconds: 5
livenessProbe:
httpGet:
path: /healthz
port: 8080
httpHeaders:
- name: X-Custom-Header
value: Awesome
initialDelaySeconds: 3
periodSeconds: 3
livenessProbe:
tcpSocket:
port: 8080
initialDelaySeconds: 15
periodSeconds: 20
1livenessProbe (存活检查)
如果检查失败,杀死容器,根据Pod的restartPolice进行操作
2readinessProbe (就绪检查)
如果检查失败,Kubernetesu会把Pod从service endpoints中剔除
#Probe支持以下三种检查方法
1 httpGet 发送HTTP请求,返回200-400范围状态为成功
2 exec 执行shell命令返回状态码0为成功
3 tcpSocket 发起TCP Socket建立成功
Pod调度策略 怎么把POD部署到对应的节点中
kubectl apply -f
kubectl get pods
kubectl get pods -o wide
master -> createpod -> apiserver -> 存etcd
shcheduler -> apiserver (是否有新容器创建) -> 读etcd ->调度算法 pod 存某node
node -> kubelet --> apiserver -读etcd 拿到分配到当前节点的pod --docker创建
pod影响调度的属性
1 Pod资源限制 resources 节点资源不够会影响调度
2 节点选择器标签 对节点进行分组
首先对节点进行标签
kubectl label node node1 env_role=prod
kubectl get nodes node1 --show-labels
apiVersion: v1
kind: Pod
metadata:
name: pod-example
space:
nodeSelector:
env_role: prod
containers:
- name: nginx
image: nginx:1.15
3节点的亲和性
apiVersion: v1
kind: Pod
metadata:
name: with-node-affinity
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgoredDuringExecution: #硬亲和性 约束条件必须满足
nodeSelectorssion:
- key: env_role
operation: In
values:
- dev
- test
preferredDuringSchedulingIgnoredDuringExecution: #软亲和性 尝试满足 不保证
- weight: 1
prference:
matchExpression:
- key: group
operator: In #常见的操作符(IN,NotIn,Exists,Gt,Lt,DoesNotExists)
values:
- otherprod
containers:
- name: webdemo
image: nginx
4 污点和污点容忍
专用节点
配置特点硬件信息
基于Taint驱逐
查看节点污点情况
kubectl describe node k8s-master | grep Taint
NoSchedule:一定不被调度
PreferNoSchedule:尽量不被调度
NoExecute:不会调度,并且还会驱逐Node已有的Pod
设置污点
Kubectl tain node nodename key=value:污点3个值
删除污点
kubectl taint node nodename key:值- #最后加减号
污点的容忍 设置了之后也会被调用相对于软亲和性
spec:
toleration:
- key: "key"
operator: "Equal"
value: "value"
offect: "NoSchedule"
controller
1 什么是controller 在集群上管理和运行容器的对象
2 Pod和controller关系 Pod通过controller实现应用的运维(伸缩,滚动升级等)通过label建立关系 工作负载
3 Deployment控制器应用场景
部署无状态应用,管理Pod和ReplicaSet web服务,微服务
4 yaml文件字段说明
kubectl create deployment web --image=nginx --dry-run -o yaml > web.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
creationTimestamp: null
labels:
app: web
name: web
spec:
replicas: 1
selector:
matchLabels:
app: web
strategy:
template:
metadata:
creationTimestamp: null
labels:
app: web
spec:
containers:
- image: nginx
name: nginx
resources:
status:
对外暴露端口
kubectl expose deployment web --port=80 --type=NodePort --target-port=80 --name=web1 -o yaml > web1.yaml
5 Deployment控制器应用场景:web服务,微服务
6 升级回滚
kubectl set image deployment web nginx=nginx:1.15 升级
kubectl rollout status deployment web 查看状态
kubectl rollout history deployment web 查看升级的历史
kubectl rollout undo deployment web 还原到上一个版本
kubectl rollout undo deployment web --to-revision=2 回到指定版本
7 弹性伸缩
kubectl scale deployment web replicas=10 副本数加到10 个
service
service 定义一组pod的访问规则
防止Pods失联(服务发现)
service虚拟IP
service 通过 label 和selector与Pod建立连接 实现pod负载均衡
selector:
app:nginx
labels:
app:nginx
常用的service类型
ClusterIP 默认集群内部使用
NodePort 对外暴露
LoadBalance 对外访问应用使用,共有云
apiVersion: v1
kind: Service
metadata:
creationTimestamp: null
labels:
app: web
name: web
spec:
ports:
- port: 80
protocol: TCP
targetPort: 80
selector:
app: web
status:
loadBalancer:
kubectl get pod,svc #使用内部IP访问
curl 10.1.196.78
apiVersion: v1
kind: Service
metadata:
creationTimestamp: null
labels:
app: web
name: web1
spec:
ports:
- port: 80
protocol: TCP
targetPort: 80
selector:
app: web
type: NodePort
status:
loadBalancer:
kubectl get pod,svc #查看外部端口访问
controller
一 有状态,无状态
无状态
1 认为Pod都是一样的
2 没有顺序要求
3 不用考虑在哪个node运行
4 随意进行伸缩,扩展
有状态
上面的因素都要考虑
让每个pod独立的,保持pod启动顺序和唯一性
有序,比如mysql主从
二部署有状态应用
*无头service
kubectl get pod,svc
ClusterIP: none
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-D9Ertq5d-1618476563772)(C:\\Users\\24970\\AppData\\Local\\Temp\\企业微信截图_16159504275471.png)]
apiVersion: v1
kind: Service
metadata:
name: nginx
labels:
app: nginx
spec:
ports:
- port: 80
clusterIP: None
selector:
app: nginx
---
apiVersion: apps/v1
kind: StatefulSet #有状态
metadata:
name: nginx-statefulest
namespace: default
spec:
serviceName: nginx
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
deploymet 和 StatefulSet区别
有身份的(唯一标识)
根据主机名 + 按照一定的规程生成 域名
格式: 主机名称.service名称.名称空间.svc.cluster.local
ngnix-statefulest.nginx.default.svc.cluster.local
部署守护进程DaemonSet
在每个node上运行一个pod,新加入的node也同样运行在一个pod里面
例字: 在每个node节点安装数据采集工具、
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: ds-test
labels:
app: filebeat
spec:
selector:
matchLabels:
app: filebeat
template:
metadata:
labels:
app: filebeat
spec:
containers:
- name: logs
image: nginx
ports:
- containerPort:80
volumeMounts:
- name: varlog
mountPath: /tmp/log
volumes:
- name: varlog
hostPath:
path: /var/log
4job一次性执行
apiVersion: batch/v1
kind: Job
metadata:
name: p1
spec:
template:
spec:
containers:
- name: p1
image: perl
command: ['perl', '-Mbignum=bpi', '-wle', 'print bpi(2000)']
restartPolicy: Never
backoffLimit: 4
5cronjob定时任务
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: hello
spec:
schedule: "*/1 * * * *"
jobTemplate:
spec:
template:
spec:
containers:
- name: hello
image: busybox
args:
- /bin/sh
- -c
- date; echo Hello from the Kubernetes cluster
restartPolicy: OnFailure
Secret
作用:加密数据存在etcd里面 让Pod容器以挂载Volume方式进行访问
1 创建secret
echo admin | base64
echo 123456 | base64
apiVersion: v1
kind: Secret
metadata:
name: mysecret
type: Opaque
data:
username: YWRtaW4K
password: MTIzNDU2Cg==
2 挂载变量形式
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: nginx
image: nginx
env:
- name: SECRET_USERNAME
valueFrom:
secretKeyRef:
name: mysecret
key: username
- name: SECRET_PASSWORD
valueFrom:
secretKeyRef:
name: mysecret
key: password
kubectl exec -it mypod bash
root@mypod:/# echo $SECRET_USERNAME
admin
root@mypod:/# echo $SECRET_PASSWORD
123456
3挂载数据卷形式
apiVersion: v1
kind: Pod
metadata:
name: mypod2
spec:
containers:
- name: nginx
image: nginx
volumeMounts:
- name: foo
mountPath: "/etc/foo"
readOnly: true
volumes:
- name: foo
secret:
secretName: mysecret
kubectl exec -it mypod2 bash
root@mypod2:/# cd /etc/foo/
root@mypod2:/etc/foo# ls
password username
root@mypod2:/etc/foo# cat username
admin
root@mypod2:/etc/foo# cat password
123456
ConfigMap
作用:存储不加密的数据到etcd 让Pod以变量的形式 挂载到容器
场景 配置文件
kubectl create configmap redis-config --from-file=redis.properties
kubectl get configmap
kubectl describe cm redis-config
挂载 以文件的形式
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: busybox
image: busybox
command: ["/bin/sh","-c","cat /etc/config/redis.properties"]
volumeMounts:
- name: config-volume
mountPath: /etc/config/
volumes:
- name: config-volume
configMap:
name: redis-config
restartPolicy: Never
挂载 以变量的形式
创建配置文件
apiVersion: v1
kind: ConfigMap
metadata:
name: myconfig
namespace: default
data:
special.level: info
special.type: hello
kubectl apply -f myconf.yaml
kubectl get cm
kubectl describe cm myconf
挂载
apiVersion: v1
kind: Pod
metadata:
name: mypod2
spec:
containers:
- name: busybox
image: busybox
command: ["/bin/sh", "-c","echo $(LEVEL) $(TYPE)"]
env:
- name: LEVEL
valueFrom:
configMapKeyRef:
name: myconfig
key: special.level
- name: TYPE
valueFrom:
configMapKeyRef:
name: myconfig
key: special.type
restartPolicy: Never
kubectl describe pods mypod2
k8s集群安全机制
一 概述
访问k8s需要经过3个步骤
第一步 认证
第二部 鉴权 (授权)
第三步 准入控制
二进行访问的时候,过程中需要经过apiserver
做统一协调,就像门卫,访问过程中需要证书,token,或者用户名+密码
如果访问pod 需要 serviceAccount
第一步 传输安全
客户端认证的常用方式:
https 证书认证,基于ca证书
http token 认证, 通过token 识别用户
http基本认证 用户名+密码
第二步 鉴权(授权)
基于RBAC进行鉴权操作
基于角色进行访问控制
第三步准入控制
就是准入控制器的列表,如果列表又请求内容,通过,,没有拒绝
#创建命名空间
kubectl create ns roleddemo
kubectl get ns
#创建pod
kubectl run nginx --image=nginx -n roleddemo
kubectl get pods -n roleddemo
#创建角色
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
namespace: roleddemo
name: pod-reader
rules:
- apiGroups: [""] # "" indicates the core API group
resources: ["pods"]
verbs: ["get", "watch", "list"]
kubectl apply -f role.yaml
kubectl get role -n roleddemo
#角色绑定
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: read-pods
namespace: roleddemo
subjects:
- kind: User
name: lucy
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: Role
name: pod-reader
apiGroup: rbac.authorization.k8s.io
kubectl apply -f roler.yaml
kubectl get role,rolebinding -n roleddemo
#创建证书
Ingerss
把端口对外暴露,通过IP+端口号进行访问
使用Service里面的NodePort实现
缺点 :在每个节点上都会起到端口,在访问的时候通过任何节点,通过节点ip+暴露端口号实现访问
意味着每个端口只能使用一次,一个端口对应一个应用
Ingress 和Pod关系
Pod和ingress通过service关联
ingress作为第一入口,由service关联一组pod
使用ingress
第一步 部署ingress Controller
第二步 创建 ingress规则
#创建 nginx 应用 对外暴露端口NodePort
kubectl create deployment web --image=nginx
#暴露端口
kubectl expose deployment web --port=80 --target-port=80 --type=NodePort
#部署ingress
apiVersion: v1
kind: Namespace
metadata:
name: ingress-nginx
labels:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
---
kind: ConfigMap
apiVersion: v1
metadata:
name: nginx-configuration
namespace: ingress-nginx
labels:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
---
kind: ConfigMap
apiVersion: v1
metadata:
name: tcp-services
namespace: ingress-nginx
labels:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
---
kind: ConfigMap
apiVersion: v1
metadata:
name: udp-services
namespace: ingress-nginx
labels:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: nginx-ingress-serviceaccount
namespace: ingress-nginx
labels:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRole
metadata:
name: nginx-ingress-clusterrole
labels:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
rules:
- apiGroups:
- ""
resources:
- configmaps
- endpoints
- nodes
- pods
- secrets
verbs:
- list
- watch
以上是关于k8s常用命令与样例模板-sicc的学习之路的主要内容,如果未能解决你的问题,请参考以下文章