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的学习之路的主要内容,如果未能解决你的问题,请参考以下文章

k8s学习-污点和容忍(概念模版创建删除)

k8s学习-污点和容忍(概念模版创建删除)

k8s 亲和性和反亲和性 以及污点和容忍

k8s不常用设置-禁止master调度

shell简单命令与if语句,从这里开始shell的学习之路

计算机专业毕业生求职升学面试 项目亮点,算法原理 双语介绍思路与样例