1、资源创建方式
命令行方式 YAML文件方式
2、Namespace
名称空间用来隔离资源,默认只隔离资源不隔离网络
#创建一个名称空间kubectl create ns hello#删除一个名称空间kubectl delete ns hello#查看所以名称空间kubectl get namespaces
3、打标签
#给节点打标签## k8s中万物皆对象。node:机器 Pod:应用容器###加标签 《h1》kubectl label node k8s-02 node-role.kubernetes.io/worker=''###去标签kubectl label node k8s-02 node-role.kubernetes.io/worker-###查看k8s对象的标签kubectl get ns --show-labels
4、集群节点信息
kubectl get nodes

#不带名称空间查看默认kubectl get all#查看当前集群所有资源 -o wide 查看更加详细的信息kubectl get all -A -o wide
5、设置ipvs模式
k8s整个集群为了访问通;默认是用iptables,性能下(kube-proxy在集群之间同步iptables的内容)在集群节点数量过大的时候性能急剧下降
#1、查看默认kube-proxy 使用的模式kubectl logs -n kube-system kube-proxy-28xv4#2、需要修改 kube-proxy 的配置文件,修改mode 为ipvs。默认iptables,但是集群大了以后就很慢kubectl edit cm kube-proxy -n kube-system#修改如下 找到mode配置 修改成ipvs即可ipvs:excludeCIDRs: nullminSyncPeriod: 0sscheduler: ""strictARP: falsesyncPeriod: 30skind: KubeProxyConfigurationmetricsBindAddress: 127.0.0.1:10249mode: "ipvs"###修改了kube-proxy的配置,为了让重新生效,需要杀掉以前的Kube-proxy#grep 管道命令 可以过滤kubectl get pod -A|grep kube-proxy#修改了配置文件之后,需要杀死kube-proxy运行的pod 在k8s集群中杀死pod之后会在拉起一个新的pod# -n 在删除pod的时候指定名称空间设置ipvs模式kubectl delete pod kube-proxy-pqgnt -n kube-system### 修改完成后可以重启kube-proxy以生效
6、Pod
运行中的一组容器,Pod是kubernetes中应用的最小单位,pod默认集群内访问,浏览器不能直接访问
一#以下命令都要带 指定自己的名称空间 -n ns#运行一个 pod容器kubectl run mynginx --image=nginx# 查看default名称空间的Podkubectl get pod# 描述 此命令用来排错kubectl describe pod 你自己的Pod名字# 删除kubectl delete pod Pod名字# 查看Pod的运行日志kubectl logs Pod名字# 每个Pod - k8s都会分配一个ipkubectl get pod -o wide# 使用Pod的ip+pod里面运行容器的端口curl 192.168.169.136#进入pod 容器内部kubectl exec -it pod名称 -- /bin/bashexit 退出当前pod容器# 集群中的任意一个机器以及任意的应用都能通过Pod分配的ip来访问这个Pod
apiVersion: v1kind: Podmetadata:labels:run: mynginxname: mynginx# namespace: defaultspec:containers:- image: nginxname: mynginx
#版本号apiVersion: v1kind: Podmetadata:labels:run: myappname: myappspec:#数组形式 pod最小单位可以一次部署多个容器 他们在一个local环境containers:- image: nginxname: nginx- image: tomcat:8.5.68name: tomcat
7、yaml
#基于一个yaml文件 执行一次部署kubectl apply -f hello.yaml#删除上次基于这个文件部署的行为kubectl delete -f hello.yaml
8、Deployment
控制Pod,使Pod拥有多副本,自愈,扩缩容等能力
#获取当前所有的部署信息kubectl get deploy#获取当前某个部署的详细信息 -oyaml 以yaml资源形式展示kubectl get deploy my-aep -oyaml
1、自愈能力
# 比较下面两个命令有何不同效果?#部署一个nginx镜像 但是没有自愈能力,使用kubectl delete pod mynginx 可以直接删掉这个容器,并且不会拉起新的服务kubectl run mynginx --image=nginx#部署一个nginx镜像 有自愈能力,使用kubectl delete pod mynginx 可以直接删掉这个容器,#并且会拉起一个新的服务kubectl create deployment mytomcat --image=tomcat:8.5.68# 自愈能力#如果确实想要删除Deployment部署的一次项目kubectl delete deployment mytomcat -n 名称空间 默认名称空间可以不带届时将会真正删除mytomcat这次部署
2、多副本能力
#--replicas=3 指定这次部署 有多少个副本kubectl create deployment my-dep --image=nginx --replicas=3
apiVersion: apps/v1kind: Deploymentmetadata:labels:app: my-depname: my-depspec:replicas: 3selector:matchLabels:app: my-deptemplate:metadata:labels:app: my-depspec:containers:- image: nginxname: nginx
3、扩缩容
#deployment/my-dep 后面是要扩容还是缩容的部署名称kubectl scale deployment/my-dep --replicas=5
#每次执行一次deployment部署 k8s会为这次部署生成一个yaml资源文件,可以直接修改这个yaml来扩缩容kubectl edit deployment my-dep#修改 replicas 参数
4、滚动更新
#滚动更新 就是重新设置image的的名称 原镜像名称=新镜像名称kubectl set image deployment/my-dep nginx=nginx:1.16.1 --record# 查看滚动更新的状态kubectl rollout status deployment/my-dep# 修改kubectl edit deployment/my-dep
5、版本回退
#历史记录kubectl rollout history deployment/my-dep#查看某个历史详情kubectl rollout history deployment/my-dep --revision=2#回滚(回到上次)kubectl rollout undo deployment/my-dep#回滚(回到指定版本)kubectl rollout undo deployment/my-dep --to-revision=2
6、更多
更多: 除了Deployment,k8s还有
StatefulSet、DaemonSet、Job等 类型资源。我们都称为工作负载。 有状态应用使用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
# 等同于没有--type的kubectl expose deployment my-dep --port=8000 --target-port=80 --type=ClusterIP
apiVersion: v1kind: Servicemetadata:labels:app: my-depname: my-depspec:ports:- port: 8000protocol: TCPtargetPort: 80selector:app: my-deptype: ClusterIP
NodePort
kubectl expose deployment my-dep --port=8000 --target-port=80 --type=NodePort
暴露网络类型为type=NodePort时候,可以使用集群内地址+8000端口访问 或者是任意一个节点的ip+30948端口访问,每台节点服务器的30948端口都开

apiVersion: v1kind: Servicemetadata:labels:app: my-depname: my-depspec:ports:- port: 8000protocol: TCPtargetPort: 80selector:app: my-deptype: NodePort
#获取当前所有 service 服务kubectl get service#暴露Deploy#--port=8000 服务Service对外暴露端口#--target-port=80 Service对外暴露端口映射pod容器内部端口kubectl expose deployment my-dep --port=8000 --target-port=80#使用标签检索Podkubectl get pod -l app=my-dep
apiVersion: v1kind: Servicemetadata:labels:app: my-depname: my-depspec:ports:- port: 8000protocol: TCPtargetPort: 80selector:app: my-deptype: ClusterIP
#Service实际上是给一组pod 打上标签 通过标签过滤给哪些相同的pod代理负载均衡#app=my-dep 对应上方yaml的 selector:app:my-depkubectl get pod --show-lables
10、存储抽象
原生docker文件目录挂载只能是当前机器,在k8s集群环境下不适用 k8s默认支持多种网络文件管理系统,此次使用nfs nfs可以选择k8s节点其中一个当做文件服务器,其他节点关联,只要任意节点修改了nfs挂载出去的文件目录的内容,其他节点都会同步
1、安装nfs文件服务器
#所有机器安装yum install -y nfs-utils
#nfs主节点echo "/nfs/data/ *(insecure,rw,sync,no_root_squash)" > /etc/exportsmkdir -p /nfs/datasystemctl enable rpcbind --nowsystemctl enable nfs-server --now#配置生效exportfs -r
#该命令只是检查文件服务器目录挂载情况showmount -e 172.31.0.4#执行以下命令挂载 nfs 服务器上的共享目录到本机路径 /root/nfsmountmkdir -p /nfs/datamount -t nfs 172.31.0.4:/nfs/data /nfs/data# 写入一个测试文件echo "hello nfs server" > /nfs/data/test.txt
## 创建了一个存储类apiVersion: storage.k8s.io/v1kind: StorageClassmetadata:name: managed-nfs-storageannotations:storageclass.kubernetes.io/is-default-class: "true"provisioner: k8s-sigs.io/nfs-subdir-external-provisioner#provisioner指定一个供应商的名字。#必须匹配 k8s-deployment 的 env PROVISIONER_NAME的值parameters:archiveOnDelete: "true" ## 删除pv的时候,pv的内容是否要备份#### 这里可以调整供应商能力。---apiVersion: apps/v1kind: Deploymentmetadata:name: nfs-client-provisionerlabels:app: nfs-client-provisioner# replace with namespace where provisioner is deployednamespace: defaultspec:replicas: 1strategy:type: Recreateselector:matchLabels:app: nfs-client-provisionertemplate:metadata:labels:app: nfs-client-provisionerspec:serviceAccountName: nfs-client-provisionercontainers:- name: nfs-client-provisionerimage: registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images/nfs-subdir-external-provisioner:v4.0.2# resources:# limits:# cpu: 10m# requests:# cpu: 10mvolumeMounts:- name: nfs-client-rootmountPath: /persistentvolumesenv:- name: PROVISIONER_NAMEvalue: k8s-sigs.io/nfs-subdir-external-provisioner- name: NFS_SERVERvalue: 192.168.10.106 ## 指定自己nfs服务器地址- name: NFS_PATHvalue: /nfs/data ## nfs服务器共享的目录volumes:- name: nfs-client-rootnfs:server: 192.168.10.106path: /nfs/data---apiVersion: v1kind: ServiceAccountmetadata:name: nfs-client-provisioner# replace with namespace where provisioner is deployednamespace: default---kind: ClusterRoleapiVersion: rbac.authorization.k8s.io/v1metadata:name: nfs-client-provisioner-runnerrules:- apiGroups: [""]resources: ["nodes"]verbs: ["get", "list", "watch"]- apiGroups: [""]resources: ["persistentvolumes"]verbs: ["get", "list", "watch", "create", "delete"]- apiGroups: [""]resources: ["persistentvolumeclaims"]verbs: ["get", "list", "watch", "update"]- apiGroups: ["storage.k8s.io"]resources: ["storageclasses"]verbs: ["get", "list", "watch"]- apiGroups: [""]resources: ["events"]verbs: ["create", "update", "patch"]---kind: ClusterRoleBindingapiVersion: rbac.authorization.k8s.io/v1metadata:name: run-nfs-client-provisionersubjects:- kind: ServiceAccountname: nfs-client-provisioner# replace with namespace where provisioner is deployednamespace: defaultroleRef:kind: ClusterRolename: nfs-client-provisioner-runnerapiGroup: rbac.authorization.k8s.io---kind: RoleapiVersion: rbac.authorization.k8s.io/v1metadata:name: leader-locking-nfs-client-provisioner# replace with namespace where provisioner is deployednamespace: defaultrules:- apiGroups: [""]resources: ["endpoints"]verbs: ["get", "list", "watch", "create", "update", "patch"]---kind: RoleBindingapiVersion: rbac.authorization.k8s.io/v1metadata:name: leader-locking-nfs-client-provisioner# replace with namespace where provisioner is deployednamespace: defaultsubjects:- kind: ServiceAccountname: nfs-client-provisioner# replace with namespace where provisioner is deployednamespace: defaultroleRef:kind: Rolename: leader-locking-nfs-client-provisionerapiGroup: rbac.authorization.k8s.io
2、k8s原生方式数据挂载弊端
k8s原生方式数据挂载需要提前创建文件夹目录,不然会出现部署失败,报错没有文件夹
apiVersion: apps/v1kind: Deploymentmetadata:labels:app: nginx-pv-demoname: nginx-pv-demospec:replicas: 2selector:matchLabels:app: nginx-pv-demotemplate:metadata:labels:app: nginx-pv-demospec:containers:- image: nginxname: nginxvolumeMounts:- name: htmlmountPath: /usr/share/nginx/htmlvolumes:- name: htmlnfs:server: 172.31.0.4path: /nfs/data/nginx-pv
3、PV&PVC
PV:持久卷(Persistent Volume),将应用需要持久化的数据保存到指定位置 PVC:持久卷申明(Persistent Volume Claim),申明需要使用的持久卷规格 玩法1:先声明持久卷,在部署时指定持久卷,该方法不够灵活 玩法2:声明持久卷池,即一堆大小不等持久卷,然后声明持久卷申请,在执行一次部署的时候指定持久卷申请文件,持久卷申请会在持久卷池里面找到最符合要求大小的进行绑定
1、创建pv池
静态供应
#nfs主节点mkdir -p /nfs/data/01mkdir -p /nfs/data/02mkdir -p /nfs/data/03
创建PV
apiVersion: v1kind: PersistentVolumemetadata:name: pv01-10mspec:capacity:storage: 10MaccessModes:- ReadWriteManystorageClassName: nfsnfs:path: /nfs/data/01server: 172.31.0.4---apiVersion: v1kind: PersistentVolumemetadata:name: pv02-1gispec:capacity:storage: 1GiaccessModes:- ReadWriteManystorageClassName: nfsnfs:path: /nfs/data/02server: 172.31.0.4---apiVersion: v1kind: PersistentVolumemetadata:name: pv03-3gispec:capacity:storage: 3GiaccessModes:- ReadWriteManystorageClassName: nfsnfs:path: /nfs/data/03server: 172.31.0.4
2、PVC创建与绑定
创建PVC
kind: PersistentVolumeClaimapiVersion: v1metadata:name: nginx-pvcspec:accessModes:- ReadWriteManyresources:requests:storage: 200MistorageClassName: nfs
创建Pod绑定PVC
apiVersion: apps/v1kind: Deploymentmetadata:labels:app: nginx-deploy-pvcname: nginx-deploy-pvcspec:replicas: 2selector:matchLabels:app: nginx-deploy-pvctemplate:metadata:labels:app: nginx-deploy-pvcspec:containers:- image: nginxname: nginxvolumeMounts:- name: htmlmountPath: /usr/share/nginx/htmlvolumes:- name: htmlpersistentVolumeClaim:claimName: nginx-pvc
4、ConfigMap
抽取应用配置,并且可以自动更新
1、把之前的配置文件创建为配置集
# 创建配置,redis保存到k8s的etcd;kubectl create cm redis-conf --from-file=redis.conf
apiVersion: v1data: #data是所有真正的数据,key:默认是文件名 value:配置文件的内容redis.conf: |appendonly yeskind: ConfigMapmetadata:name: redis-confnamespace: default
2、创建Pod
apiVersion: v1kind: Podmetadata:name: redisspec:containers:- name: redisimage: rediscommand:- redis-server- "/redis-master/redis.conf" #指的是redis容器内部的位置ports:- containerPort: 6379volumeMounts:- mountPath: /dataname: data- mountPath: /redis-mastername: configvolumes:- name: dataemptyDir: {}- name: configconfigMap:name: redis-confitems:- key: redis.confpath: redis.conf
3、检查默认配置
kubectl exec -it redis -- redis-cli127.0.0.1:6379> CONFIG GET appendonly127.0.0.1:6379> CONFIG GET requirepass
4、修改ConfigMap
apiVersion: v1kind: ConfigMapmetadata:name: example-redis-configdata:redis-config: |maxmemory 2mbmaxmemory-policy allkeys-lru
5、检查配置是否更新
kubectl exec -it redis -- redis-cli127.0.0.1:6379> CONFIG GET maxmemory127.0.0.1:6379> CONFIG GET maxmemory-policy
检查指定文件内容是否已经更新 修改了CM。Pod里面的配置文件会跟着变
配置值未更改,因为需要重新启动 Pod 才能从关联的 ConfigMap 中获取更新的值。 原因:我们的Pod部署的中间件自己本身没有热更新能力
5、Secret
Secret 对象类型用来保存敏感信息,例如密码、OAuth 令牌和 SSH 密钥。 将这些信息放在 secret 中比放在 Pod 的定义或者 容器镜像 中来说更加安全和灵活。
kubectl create secret docker-registry lshady-docker \--docker-username=lshday \--docker-password=lshady666 \--docker-email=lshady@qq.com##命令格式kubectl create secret docker-registry regcred \--docker-server=<你的镜像仓库服务器> \--docker-username=<你的用户名> \--docker-password=<你的密码> \--docker-email=<你的邮箱地址>
apiVersion: v1kind: Podmetadata:name: private-nginxspec:containers:- name: private-nginximage: leifengyang/guignginx:v1.0imagePullSecrets:- 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 干跑一遍
