1、资源创建方式

命令行方式 YAML文件方式

2、Namespace

名称空间用来隔离资源,默认只隔离资源不隔离网络

  1. #创建一个名称空间
  2. kubectl create ns hello
  3. #删除一个名称空间
  4. kubectl delete ns hello
  5. #查看所以名称空间
  6. kubectl get namespaces

3、打标签

  1. #给节点打标签
  2. ## k8s中万物皆对象。node:机器 Pod:应用容器
  3. ###加标签 《h1》
  4. kubectl label node k8s-02 node-role.kubernetes.io/worker=''
  5. ###去标签
  6. kubectl label node k8s-02 node-role.kubernetes.io/worker-
  7. ###查看k8s对象的标签
  8. kubectl get ns --show-labels

4、集群节点信息

  1. kubectl get nodes

image.png

  1. #不带名称空间查看默认
  2. kubectl get all
  3. #查看当前集群所有资源 -o wide 查看更加详细的信息
  4. kubectl get all -A -o wide

image.png

5、设置ipvs模式

k8s整个集群为了访问通;默认是用iptables,性能下(kube-proxy在集群之间同步iptables的内容)在集群节点数量过大的时候性能急剧下降

  1. #1、查看默认kube-proxy 使用的模式
  2. kubectl logs -n kube-system kube-proxy-28xv4
  3. #2、需要修改 kube-proxy 的配置文件,修改mode 为ipvs。默认iptables,但是集群大了以后就很慢
  4. kubectl edit cm kube-proxy -n kube-system
  5. #修改如下 找到mode配置 修改成ipvs即可
  6. ipvs:
  7. excludeCIDRs: null
  8. minSyncPeriod: 0s
  9. scheduler: ""
  10. strictARP: false
  11. syncPeriod: 30s
  12. kind: KubeProxyConfiguration
  13. metricsBindAddress: 127.0.0.1:10249
  14. mode: "ipvs"
  15. ###修改了kube-proxy的配置,为了让重新生效,需要杀掉以前的Kube-proxy
  16. #grep 管道命令 可以过滤
  17. kubectl get pod -A|grep kube-proxy
  18. #修改了配置文件之后,需要杀死kube-proxy运行的pod 在k8s集群中杀死pod之后会在拉起一个新的pod
  19. # -n 在删除pod的时候指定名称空间设置ipvs模式
  20. kubectl delete pod kube-proxy-pqgnt -n kube-system
  21. ### 修改完成后可以重启kube-proxy以生效

6、Pod

运行中的一组容器,Pod是kubernetes中应用的最小单位,pod默认集群内访问,浏览器不能直接访问

  1. 一#以下命令都要带 指定自己的名称空间 -n ns
  2. #运行一个 pod容器
  3. kubectl run mynginx --image=nginx
  4. # 查看default名称空间的Pod
  5. kubectl get pod
  6. # 描述 此命令用来排错
  7. kubectl describe pod 你自己的Pod名字
  8. # 删除
  9. kubectl delete pod Pod名字
  10. # 查看Pod的运行日志
  11. kubectl logs Pod名字
  12. # 每个Pod - k8s都会分配一个ip
  13. kubectl get pod -o wide
  14. # 使用Pod的ip+pod里面运行容器的端口
  15. curl 192.168.169.136
  16. #进入pod 容器内部
  17. kubectl exec -it pod名称 -- /bin/bash
  18. exit 退出当前pod容器
  19. # 集群中的任意一个机器以及任意的应用都能通过Pod分配的ip来访问这个Pod
  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4. labels:
  5. run: mynginx
  6. name: mynginx
  7. # namespace: default
  8. spec:
  9. containers:
  10. - image: nginx
  11. name: mynginx
  1. #版本号
  2. apiVersion: v1
  3. kind: Pod
  4. metadata:
  5. labels:
  6. run: myapp
  7. name: myapp
  8. spec:
  9. #数组形式 pod最小单位可以一次部署多个容器 他们在一个local环境
  10. containers:
  11. - image: nginx
  12. name: nginx
  13. - image: tomcat:8.5.68
  14. name: tomcat

7、yaml

  1. #基于一个yaml文件 执行一次部署
  2. kubectl apply -f hello.yaml
  3. #删除上次基于这个文件部署的行为
  4. kubectl delete -f hello.yaml

8、Deployment

控制Pod,使Pod拥有多副本,自愈,扩缩容等能力

  1. #获取当前所有的部署信息
  2. kubectl get deploy
  3. #获取当前某个部署的详细信息 -oyaml 以yaml资源形式展示
  4. kubectl get deploy my-aep -oyaml

1、自愈能力

  1. # 比较下面两个命令有何不同效果?
  2. #部署一个nginx镜像 但是没有自愈能力,使用kubectl delete pod mynginx 可以直接删掉这个容器,并且不会拉起新的服务
  3. kubectl run mynginx --image=nginx
  4. #部署一个nginx镜像 有自愈能力,使用kubectl delete pod mynginx 可以直接删掉这个容器,
  5. #并且会拉起一个新的服务
  6. kubectl create deployment mytomcat --image=tomcat:8.5.68
  7. # 自愈能力
  8. #如果确实想要删除Deployment部署的一次项目
  9. kubectl delete deployment mytomcat -n 名称空间 默认名称空间可以不带
  10. 届时将会真正删除mytomcat这次部署

2、多副本能力

  1. #--replicas=3 指定这次部署 有多少个副本
  2. kubectl create deployment my-dep --image=nginx --replicas=3
  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4. labels:
  5. app: my-dep
  6. name: my-dep
  7. spec:
  8. replicas: 3
  9. selector:
  10. matchLabels:
  11. app: my-dep
  12. template:
  13. metadata:
  14. labels:
  15. app: my-dep
  16. spec:
  17. containers:
  18. - image: nginx
  19. name: nginx

3、扩缩容

  1. #deployment/my-dep 后面是要扩容还是缩容的部署名称
  2. kubectl scale deployment/my-dep --replicas=5
  1. #每次执行一次deployment部署 k8s会为这次部署生成一个yaml资源文件,可以直接修改这个yaml来扩缩容
  2. kubectl edit deployment my-dep
  3. #修改 replicas 参数

4、滚动更新

  1. #滚动更新 就是重新设置image的的名称 原镜像名称=新镜像名称
  2. kubectl set image deployment/my-dep nginx=nginx:1.16.1 --record
  3. # 查看滚动更新的状态
  4. kubectl rollout status deployment/my-dep
  5. # 修改
  6. kubectl edit deployment/my-dep

5、版本回退

  1. #历史记录
  2. kubectl rollout history deployment/my-dep
  3. #查看某个历史详情
  4. kubectl rollout history deployment/my-dep --revision=2
  5. #回滚(回到上次)
  6. kubectl rollout undo deployment/my-dep
  7. #回滚(回到指定版本)
  8. kubectl rollout undo deployment/my-dep --to-revision=2

6、更多

更多: 除了Deployment,k8s还有 StatefulSetDaemonSetJob 等 类型资源。我们都称为 工作负载。 有状态应用使用 StatefulSet 部署,无状态应用使用 Deployment 部署 https://kubernetes.io/zh/docs/concepts/workloads/controllers/

9、Service-负载均衡

将一组 Pods 公开为网络服务的抽象方法。 一组pods 是由一次部署deployment 产生,所以是将这次部署聚合 对外提供一个ip+端口实现负载均衡 Service以域名方式访问规则:Service名字.名称空间.svc 例如my-dep.default.svc:8000

Service网络类型

ClusterIP

  1. # 等同于没有--type的
  2. kubectl expose deployment my-dep --port=8000 --target-port=80 --type=ClusterIP
  1. apiVersion: v1
  2. kind: Service
  3. metadata:
  4. labels:
  5. app: my-dep
  6. name: my-dep
  7. spec:
  8. ports:
  9. - port: 8000
  10. protocol: TCP
  11. targetPort: 80
  12. selector:
  13. app: my-dep
  14. type: ClusterIP

NodePort

  1. kubectl expose deployment my-dep --port=8000 --target-port=80 --type=NodePort

暴露网络类型为type=NodePort时候,可以使用集群内地址+8000端口访问 或者是任意一个节点的ip+30948端口访问,每台节点服务器的30948端口都开

image.png

  1. apiVersion: v1
  2. kind: Service
  3. metadata:
  4. labels:
  5. app: my-dep
  6. name: my-dep
  7. spec:
  8. ports:
  9. - port: 8000
  10. protocol: TCP
  11. targetPort: 80
  12. selector:
  13. app: my-dep
  14. type: NodePort
  1. #获取当前所有 service 服务
  2. kubectl get service
  3. #暴露Deploy
  4. #--port=8000 服务Service对外暴露端口
  5. #--target-port=80 Service对外暴露端口映射pod容器内部端口
  6. kubectl expose deployment my-dep --port=8000 --target-port=80
  7. #使用标签检索Pod
  8. kubectl get pod -l app=my-dep
  1. apiVersion: v1
  2. kind: Service
  3. metadata:
  4. labels:
  5. app: my-dep
  6. name: my-dep
  7. spec:
  8. ports:
  9. - port: 8000
  10. protocol: TCP
  11. targetPort: 80
  12. selector:
  13. app: my-dep
  14. type: ClusterIP
  1. #Service实际上是给一组pod 打上标签 通过标签过滤给哪些相同的pod代理负载均衡
  2. #app=my-dep 对应上方yaml的 selector:app:my-dep
  3. kubectl get pod --show-lables

image.png

10、存储抽象

原生docker文件目录挂载只能是当前机器,在k8s集群环境下不适用 k8s默认支持多种网络文件管理系统,此次使用nfs nfs可以选择k8s节点其中一个当做文件服务器,其他节点关联,只要任意节点修改了nfs挂载出去的文件目录的内容,其他节点都会同步

1、安装nfs文件服务器

  1. #所有机器安装
  2. yum install -y nfs-utils
  1. #nfs主节点
  2. echo "/nfs/data/ *(insecure,rw,sync,no_root_squash)" > /etc/exports
  3. mkdir -p /nfs/data
  4. systemctl enable rpcbind --now
  5. systemctl enable nfs-server --now
  6. #配置生效
  7. exportfs -r
  1. #该命令只是检查文件服务器目录挂载情况
  2. showmount -e 172.31.0.4
  3. #执行以下命令挂载 nfs 服务器上的共享目录到本机路径 /root/nfsmount
  4. mkdir -p /nfs/data
  5. mount -t nfs 172.31.0.4:/nfs/data /nfs/data
  6. # 写入一个测试文件
  7. echo "hello nfs server" > /nfs/data/test.txt
  1. ## 创建了一个存储类
  2. apiVersion: storage.k8s.io/v1
  3. kind: StorageClass
  4. metadata:
  5. name: managed-nfs-storage
  6. annotations:
  7. storageclass.kubernetes.io/is-default-class: "true"
  8. provisioner: k8s-sigs.io/nfs-subdir-external-provisioner
  9. #provisioner指定一个供应商的名字。
  10. #必须匹配 k8s-deployment 的 env PROVISIONER_NAME的值
  11. parameters:
  12. archiveOnDelete: "true" ## 删除pv的时候,pv的内容是否要备份
  13. #### 这里可以调整供应商能力。
  14. ---
  15. apiVersion: apps/v1
  16. kind: Deployment
  17. metadata:
  18. name: nfs-client-provisioner
  19. labels:
  20. app: nfs-client-provisioner
  21. # replace with namespace where provisioner is deployed
  22. namespace: default
  23. spec:
  24. replicas: 1
  25. strategy:
  26. type: Recreate
  27. selector:
  28. matchLabels:
  29. app: nfs-client-provisioner
  30. template:
  31. metadata:
  32. labels:
  33. app: nfs-client-provisioner
  34. spec:
  35. serviceAccountName: nfs-client-provisioner
  36. containers:
  37. - name: nfs-client-provisioner
  38. image: registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images/nfs-subdir-external-provisioner:v4.0.2
  39. # resources:
  40. # limits:
  41. # cpu: 10m
  42. # requests:
  43. # cpu: 10m
  44. volumeMounts:
  45. - name: nfs-client-root
  46. mountPath: /persistentvolumes
  47. env:
  48. - name: PROVISIONER_NAME
  49. value: k8s-sigs.io/nfs-subdir-external-provisioner
  50. - name: NFS_SERVER
  51. value: 192.168.10.106 ## 指定自己nfs服务器地址
  52. - name: NFS_PATH
  53. value: /nfs/data ## nfs服务器共享的目录
  54. volumes:
  55. - name: nfs-client-root
  56. nfs:
  57. server: 192.168.10.106
  58. path: /nfs/data
  59. ---
  60. apiVersion: v1
  61. kind: ServiceAccount
  62. metadata:
  63. name: nfs-client-provisioner
  64. # replace with namespace where provisioner is deployed
  65. namespace: default
  66. ---
  67. kind: ClusterRole
  68. apiVersion: rbac.authorization.k8s.io/v1
  69. metadata:
  70. name: nfs-client-provisioner-runner
  71. rules:
  72. - apiGroups: [""]
  73. resources: ["nodes"]
  74. verbs: ["get", "list", "watch"]
  75. - apiGroups: [""]
  76. resources: ["persistentvolumes"]
  77. verbs: ["get", "list", "watch", "create", "delete"]
  78. - apiGroups: [""]
  79. resources: ["persistentvolumeclaims"]
  80. verbs: ["get", "list", "watch", "update"]
  81. - apiGroups: ["storage.k8s.io"]
  82. resources: ["storageclasses"]
  83. verbs: ["get", "list", "watch"]
  84. - apiGroups: [""]
  85. resources: ["events"]
  86. verbs: ["create", "update", "patch"]
  87. ---
  88. kind: ClusterRoleBinding
  89. apiVersion: rbac.authorization.k8s.io/v1
  90. metadata:
  91. name: run-nfs-client-provisioner
  92. subjects:
  93. - kind: ServiceAccount
  94. name: nfs-client-provisioner
  95. # replace with namespace where provisioner is deployed
  96. namespace: default
  97. roleRef:
  98. kind: ClusterRole
  99. name: nfs-client-provisioner-runner
  100. apiGroup: rbac.authorization.k8s.io
  101. ---
  102. kind: Role
  103. apiVersion: rbac.authorization.k8s.io/v1
  104. metadata:
  105. name: leader-locking-nfs-client-provisioner
  106. # replace with namespace where provisioner is deployed
  107. namespace: default
  108. rules:
  109. - apiGroups: [""]
  110. resources: ["endpoints"]
  111. verbs: ["get", "list", "watch", "create", "update", "patch"]
  112. ---
  113. kind: RoleBinding
  114. apiVersion: rbac.authorization.k8s.io/v1
  115. metadata:
  116. name: leader-locking-nfs-client-provisioner
  117. # replace with namespace where provisioner is deployed
  118. namespace: default
  119. subjects:
  120. - kind: ServiceAccount
  121. name: nfs-client-provisioner
  122. # replace with namespace where provisioner is deployed
  123. namespace: default
  124. roleRef:
  125. kind: Role
  126. name: leader-locking-nfs-client-provisioner
  127. apiGroup: rbac.authorization.k8s.io

2、k8s原生方式数据挂载弊端

k8s原生方式数据挂载需要提前创建文件夹目录,不然会出现部署失败,报错没有文件夹

  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4. labels:
  5. app: nginx-pv-demo
  6. name: nginx-pv-demo
  7. spec:
  8. replicas: 2
  9. selector:
  10. matchLabels:
  11. app: nginx-pv-demo
  12. template:
  13. metadata:
  14. labels:
  15. app: nginx-pv-demo
  16. spec:
  17. containers:
  18. - image: nginx
  19. name: nginx
  20. volumeMounts:
  21. - name: html
  22. mountPath: /usr/share/nginx/html
  23. volumes:
  24. - name: html
  25. nfs:
  26. server: 172.31.0.4
  27. path: /nfs/data/nginx-pv

3、PV&PVC

PV:持久卷(Persistent Volume),将应用需要持久化的数据保存到指定位置 PVC:持久卷申明(Persistent Volume Claim),申明需要使用的持久卷规格 玩法1:先声明持久卷,在部署时指定持久卷,该方法不够灵活 玩法2:声明持久卷池,即一堆大小不等持久卷,然后声明持久卷申请,在执行一次部署的时候指定持久卷申请文件,持久卷申请会在持久卷池里面找到最符合要求大小的进行绑定

1、创建pv池

静态供应

  1. #nfs主节点
  2. mkdir -p /nfs/data/01
  3. mkdir -p /nfs/data/02
  4. mkdir -p /nfs/data/03

创建PV

  1. apiVersion: v1
  2. kind: PersistentVolume
  3. metadata:
  4. name: pv01-10m
  5. spec:
  6. capacity:
  7. storage: 10M
  8. accessModes:
  9. - ReadWriteMany
  10. storageClassName: nfs
  11. nfs:
  12. path: /nfs/data/01
  13. server: 172.31.0.4
  14. ---
  15. apiVersion: v1
  16. kind: PersistentVolume
  17. metadata:
  18. name: pv02-1gi
  19. spec:
  20. capacity:
  21. storage: 1Gi
  22. accessModes:
  23. - ReadWriteMany
  24. storageClassName: nfs
  25. nfs:
  26. path: /nfs/data/02
  27. server: 172.31.0.4
  28. ---
  29. apiVersion: v1
  30. kind: PersistentVolume
  31. metadata:
  32. name: pv03-3gi
  33. spec:
  34. capacity:
  35. storage: 3Gi
  36. accessModes:
  37. - ReadWriteMany
  38. storageClassName: nfs
  39. nfs:
  40. path: /nfs/data/03
  41. server: 172.31.0.4

2、PVC创建与绑定

创建PVC

  1. kind: PersistentVolumeClaim
  2. apiVersion: v1
  3. metadata:
  4. name: nginx-pvc
  5. spec:
  6. accessModes:
  7. - ReadWriteMany
  8. resources:
  9. requests:
  10. storage: 200Mi
  11. storageClassName: nfs

创建Pod绑定PVC

  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4. labels:
  5. app: nginx-deploy-pvc
  6. name: nginx-deploy-pvc
  7. spec:
  8. replicas: 2
  9. selector:
  10. matchLabels:
  11. app: nginx-deploy-pvc
  12. template:
  13. metadata:
  14. labels:
  15. app: nginx-deploy-pvc
  16. spec:
  17. containers:
  18. - image: nginx
  19. name: nginx
  20. volumeMounts:
  21. - name: html
  22. mountPath: /usr/share/nginx/html
  23. volumes:
  24. - name: html
  25. persistentVolumeClaim:
  26. claimName: nginx-pvc

4、ConfigMap

抽取应用配置,并且可以自动更新

redis示例

1、把之前的配置文件创建为配置集

  1. # 创建配置,redis保存到k8s的etcd;
  2. kubectl create cm redis-conf --from-file=redis.conf
  1. apiVersion: v1
  2. data: #data是所有真正的数据,key:默认是文件名 value:配置文件的内容
  3. redis.conf: |
  4. appendonly yes
  5. kind: ConfigMap
  6. metadata:
  7. name: redis-conf
  8. namespace: default

2、创建Pod

  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4. name: redis
  5. spec:
  6. containers:
  7. - name: redis
  8. image: redis
  9. command:
  10. - redis-server
  11. - "/redis-master/redis.conf" #指的是redis容器内部的位置
  12. ports:
  13. - containerPort: 6379
  14. volumeMounts:
  15. - mountPath: /data
  16. name: data
  17. - mountPath: /redis-master
  18. name: config
  19. volumes:
  20. - name: data
  21. emptyDir: {}
  22. - name: config
  23. configMap:
  24. name: redis-conf
  25. items:
  26. - key: redis.conf
  27. path: redis.conf

3、检查默认配置

  1. kubectl exec -it redis -- redis-cli
  2. 127.0.0.1:6379> CONFIG GET appendonly
  3. 127.0.0.1:6379> CONFIG GET requirepass

4、修改ConfigMap

  1. apiVersion: v1
  2. kind: ConfigMap
  3. metadata:
  4. name: example-redis-config
  5. data:
  6. redis-config: |
  7. maxmemory 2mb
  8. maxmemory-policy allkeys-lru

5、检查配置是否更新

  1. kubectl exec -it redis -- redis-cli
  2. 127.0.0.1:6379> CONFIG GET maxmemory
  3. 127.0.0.1:6379> CONFIG GET maxmemory-policy

检查指定文件内容是否已经更新 修改了CM。Pod里面的配置文件会跟着变

配置值未更改,因为需要重新启动 Pod 才能从关联的 ConfigMap 中获取更新的值。 原因:我们的Pod部署的中间件自己本身没有热更新能力

5、Secret

Secret 对象类型用来保存敏感信息,例如密码、OAuth 令牌和 SSH 密钥。 将这些信息放在 secret 中比放在 Pod 的定义或者 容器镜像 中来说更加安全和灵活。

  1. kubectl create secret docker-registry lshady-docker \
  2. --docker-username=lshday \
  3. --docker-password=lshady666 \
  4. --docker-email=lshady@qq.com
  5. ##命令格式
  6. kubectl create secret docker-registry regcred \
  7. --docker-server=<你的镜像仓库服务器> \
  8. --docker-username=<你的用户名> \
  9. --docker-password=<你的密码> \
  10. --docker-email=<你的邮箱地址>
  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4. name: private-nginx
  5. spec:
  6. containers:
  7. - name: private-nginx
  8. image: leifengyang/guignginx:v1.0
  9. imagePullSecrets:
  10. - name: leifengyang-docker

11、如何快速编写yaml资源文件

kubectl run my-nginx666 —image=nginx #启动一个Pod
1、kubectl get pod my-nginx666 -oyaml 集群中挑一个同类资源,获取出他的yaml。
2、kubectl run my-tomcat —image=tomcat —dry-run -oyaml 干跑一遍