自我学习文档--k8s

请求控制流程:
Pod >>ReplicaSet>>Deployment>>Service
APIServer: 发送指令
API-Scheduler: 调度服务
API-ControllerManager: 发送请求
Kubelet: 管理pod
Kube-proxy: 添加防火墙规则,服务发现

资源控制器类型:
Pod ,ReplicaSet ,Deployment ,Service ,DeamonSet ,StatefulState ,Job ,CronJob ,Label ,Label SeLector ,…

创建资源的方法:
APIServer 仅接受JSON格式的资源定义,yaml 提供配置清单,APIServer可以自动转化成JSON格式,而后再提交。
查看资源配置清单的格式的详细字段信息: kubectl explain 资源类型. …

大部分的资源配置清单:
apiVersion: GROUP/VERSION
kind: xxx //资源类型
metadate:
name: xxx //没有实际意义
namespace: xxxx //指定名称空间,默认是default
labels: //没有实际意义的标签
xxx: xxxx

annatations:
xxx: xxx //注释
spec: //期望状态。

status //(当前状态,不用定义)

常用的AD-HOC:
kubectl get pod pod_name 可以加–show-labels //查看标签 -L //匹配标签 -w //动态追踪pod情况 -l //精确匹配标签 …
kubectl get svc svc_name
kubectl get deployment deloy_name
kubectl get rs rs_name

kubectl run NAME --image=IMAGE_NAME --port= --replicas= key=value …
kubectl expose deloyment deploy_name --name svc_name --type= --port --targetPort= --protocol=

kubectl edit resource/name
kubectl scale deployment DELOY_NAME --replicas=
kubectl explain …
kubectl describe …
kubectl set image
kubectl rollout
kubectl rollout undo

1.POD的资源配置清单

apiVersion: v1 //api版本
kind: Pod //资源类型
metadata: //元数据
name: pod-demo //pod的名字
namespace: default //pod所属的名称空间
labels: //pod的标签
app: myapp
tier: frontend
annotations: //pod的注释
lizhilin.com/created-by: “cluster admin”
spec: //资源配置列表
containers: // 容器限制

  • name: myspp //容器名称
    image: ikubernetes/myapp:v1 //容器需要的镜像
    ports: //容器暴露的端口
    • name: httpd //端口的名称
      containerPort: 80 //端口
    • name: https
      containerPort: 443
  • name: busybox
    image: busybox:latest
    imagePullPolicy: IfNotPresent
    command: //不运行镜像本身的命令,=docker的cmd
    • “/bin/sh”
    • “-c”
    • “sleep 5”
      nodeSelector: //节点标签选择器
      disktype: ssd
      ~

2.ReplicaSet的资源配置清单

apiVersion: apps/v1 //api版本:GROU/VERSION
kind: ReplicaSet //资源类型
metadata: //元数据
name: myapp //名称
namespace: default //所属名称空间
spec: //资源配置列表
replicas: 2 //开启副本数
selector: //对POD的标签选择
matchLabels: //标签选择的方法,还有matchExpressions(写列表),标签与标签是逻辑与的关系
app: myapp
release: canary
template: //pod模板
metadata: //pod元数据
name: myapp-pod
labels: //pod标签必须与selector一致,可以多,但是不能少
app: myapp
release: canary
environment: qa
spec: //pod的资源配置列表
containers:
- name: myapp-container
image: ikubernetes/myapp:v1
ports:
- name: http
containerPort: 80

3.Deployment的资源配置清单
apiVersion: apps/v1 //api版本:GROU/VERSION
kind: Deployment //资源类型
metadata: //元数据
name: myapp-deploy
namespace: default
spec: //资源配置列表
replicas: 3 //开启副本数
selector: //pod标签选择器
matchLabels: //标签选择方法,,还有matchExpressions(写列表),标签与标签是逻辑与的关系
app: myapp
release: canary
template: //pod模板
metadata: //pod的元数据
labels:
app: myapp
release: canary
spec: //pod的资源配置列表
containers:
- name: myapp
image: ikubernetes/myapp:v1
ports:
- name: http
containerPort: 80

4.Liveness与Readiness
创建pod时的过程:

                                   钩子

POD的生命状态:
Pending: 挂起,调度未完成
Running: 运行中
Failed: 失败
Successeded: 成功
UNknown: 未知状态

创建POD:
POD的生命周期的重要行为:
初始化容器
容器探测:
liveness: 容器存活探测
readiness: 容器准备状态探测

探针类型:
ExecAction、TCPSocketAction、HTTPGetAction
探测策略:
initialDelaySecond: 启动容器后第一次执行探针在多少秒后
periodSeconds: 执行探针的频率
timeoutSecond: 探测超时时间
successThreshod: 探测失败后,最少成功几次
failureThieshold: 探测成功后,最少连续失败几次被认定为失败

Liveness探测eg:

apiVersion: v1
kind: Pod
metadata:
name: liveness-exec-pod
namespace: default
spec:
containers:

  • name: liveness-exec-container
    image: busybox:latest
    imagePullPolicy: IfNotPresent
    command: ["/bin/sh","-c",“touch /tmp/healthy; sleep 30; rm -f /tmp/healthy ;sleep 3600 “]
    livenessProbe:
    exec:
    command: [“test”,”-e”,"/tmp/healthy"] //这个cmd运行的优先级在spec的之后
    initialDelaySeconds: 1
    periodSeconds: 3

Readiness探测eg:

apiVersion: v1
kind: Pod
metadata:
name: readiness-httpget-pod
namespace: default
spec:
containers:

  • name: readiness-httpget-container
    image: ikubernetes/myapp:v1
    imagePullPolicy: IfNotPresent //image拉取策略
    ports:
    • name: http
      containerPort: 80
      readinessProbe:
      httpGet: //探针类型
      port: http
      path: /index.html
      initialDelaySeconds: 1
      periodSeconds: 3

5.DaemonSet的资源配置清单:

类似于deployment,支持滚动更新
apiVersion: apps/v1
kind: Deployment
metadata:
name: redis
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: redis
role: logstor
template:
metadata:
labels:
app: redis
role: logstor
spec:
containers:
- name: redis
image: redis:4.0-alpine
ports:
- name: redis
containerPort: 6379

apiVersion: apps/v1
kind: DaemonSet
metadata:
name: filebeat-ds
namespace: default
spec:
selector:
matchLabels:
app: filebeat
release: stable
template:
metadata:
labels:
app: filebeat
release: stable
spec:
containers:
- name: filebeat
image: ikubernetes/filebeat:5.6.5-alpine
env:
- name: REDIS_HOST
value: redis.default.cluster.svc.cluster.local
- name: REDIS_LOG_LEVEL
value: info

6.Service的资源配置清单:

apiVersion: v1
kind: Service
metadata:
name: redis
namespace: default
spec:
selector:
app: redis
role: logstor
clusterIP: 10.97.97.97 //Sercice暴露的IP
type: ClusterIP //Service类型
ports:

  • port: 6379
    targetPort: 6379

Service发展:
userspace: client>>>service>>>proxy>>>service>>>target (watch方法实现)
iptables: client>>>service>>>target
ipvs: similar with iptables
Service类型:
ClusterIP: 仅用于集群内部通信
NodePort: 可通过节点通信
LoadBalaner: 云负载均衡
ExternaName: 可把集群外部资源加进集群
service >>>>edpoint >>>>pod
无头Service eg:
apiVersion: v1
kind: Service
metadata:
name: myapp-svc
namespace: default
spec:
clusterIP: None
ports:

  • port: 80
    targetPort: 80

存储卷
emptyDir
hostPath
gcePersistentDisk
awsElasticBlockStore
nfs
iscsi
fc (fibre channel)
flocker
glusterfs
rbd
cephfs
gitRepo
secret
persistentVolumeClaim
downwardAPI
projected
azureFileVolume
azureDisk
vsphereVolume
Quobyte
PortworxVolume
ScaleIO
StorageOS
local

emptyDir
使用emptyDir,当Pod分配到Node上时,将会创建emptyDir,并且只要Node上的Pod一直运行,Volume就会一直存。当Pod(不管任何原因)从Node上被删除时,emptyDir也同时会删除,存储的数据也将永久删除。注:删除容器不影响emptyDir。 // emptyDir是写在内存中的,所以速度特别快
apiVersion: v1
kind: Pod
metadata:
name: test-pd
spec:
containers:

  • image: gcr.io/google_containers/test-webserver
    name: test-container
    volumeMounts:
    • mountPath: /cache
      name: cache-volume
      volumes:
  • name: cache-volume
    emptyDir: {}
    hostPath
    hostPath允许挂载Node上的文件系统到Pod里面去。如果Pod需要使用Node上的文件,可以使用hostPath。
    apiVersion: v1
    kind: Pod
    metadata:
    name: test-pd
    spec:
    containers:
  • image: gcr.io/google_containers/test-webserver
    name: test-container
    volumeMounts:
    • mountPath: /test-pd
      name: test-volume
      volumes:
  • name: test-volume
    hostPath:

    directory location on host

    path: /data

PV(PersistentVolume), PVC(PersistenVolumeClaim):
是K8s的两种重要的资源类型;
用户只需要将pvc挂载到容器中,不用关注存储卷是用什么技术创建的;pvc和pv有点像pod和node的关系,前者消耗后者的资源。pvc可以向pv申请存储空间。
pv可支持多种存储类型。也可以支持hostPath;
pv和pvc是一对一的关系;
创建pv时,不要指名称空间,因为pv是k8s集群级别的;
pv的读写方式(accessModes)有:
ReadWriteOnce:(RWO) 单路读写
ReadOnlyMany:(ROX) 多路只读
ReadWriteMany:(RWX) 多路读写
可以指定存储空间大小(capacity):
storage字段写大小; G和Gi的区别1000和1024
当pv删除时,数据是否会保留,和你定义的回收策略有关,不指默认是return(保留);

创建pv,eg:

创建pvc,eg:

eg: PV+PVC+MySQL+NFS方式挂载存储卷:
apiVersion: v1
kind: PersistentVolume
metadata:
  name: nfs-pv
#  namespace: default
  labels:
    pv: nfs-pv
spec:
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteMany
  storageClassName: nfs
  nfs:
    # FIXME: use the rightIP
    server: 192.168.1.252
    path:"/home/centos7/nfs"

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-pv-claim
  labels:
    app: wordpress
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 200Mi
  storageClassName: nfs
  selector:
    matchLabels:
      pv: nfs-pv

apiVersion: v1
kind: Service
metadata:
  name: mysql-service
  labels:
    app: mysql
spec:
  ports:
    - port: 3306
  selector:
    app: mysql
    tier: mysql
  clusterIP: None

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: mysql
  labels:
    app: mysql
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mysql
      tier: mysql
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: mysql
        tier: mysql
    spec:
     containers:
     - image:192.168.1.229/project/mysql:5.7.18
       name: mysql
       env:
       - name:MYSQL_ROOT_PASSWORD
         value:“123456”
       ports:
       - containerPort:3306
         name: mysql
       volumeMounts:
       - name:mysql-persistent-storage
         mountPath:/var/lib/mysql
     volumes:
     - name:mysql-persistent-storage
      persistentVolumeClaim:
         claimName:mysql-pv-claim

StorageClass:
实现目标就是,有一整块硬盘,由用户发送请求动态生成刚好的pv。
需要有支持restful风格的存储类型,eg:glusterfs。

configMap:
配置中心,用来存放配置信息,也是k8s的资源类型之一。
· 是明文传输
可以以volume的方式挂载在pod的配置文件存放路径。覆盖配置文件;
可以以变量的方法注入配置文件;

配置容器化应用的方式:
1.自定义命令行参数的方式实现;
command,args
2.直接把配置文件备进镜像中;
3.环境变量的方式;
Clould Native的应用程序(支持传环境变量);
Entrypoint脚本预处理;
4.存储卷
创建configmap:
可以通过命令行创建,kebectl create configmp(cm) NAME --from-litral=KEY=VALUE …
创建cm文件,kebectl create configmp(cm) NAME --from-file=KEY=FILE //把file的内容变成VALUE
kebectl create configmp(cm) NAME --from-file=FILE //把文件名当键,文件内容做值;
eg:

挂载卷的方式支持动态注入;可以实时更新,但是有一点点延迟。
eg:

secret:
docker-regristry: 连接docker registry:使kubelet和regristry认证
generic: 创建一个本地的认证

挂载存储卷,详情使用kubectl explain

官方文档:http://docs.kubernetes.org.cn/429.html#Volume

Ingress:
是K8s的一种重要的资源类型
通常Kubernetes暴露服务的方法有三种,Service的NodePort、 LoadBalancer、Ingress
NodePort:暴露节点的端口,通过端口映射进具体的某个服务实现服务发布
LoadBalancer:云平台的负载均衡,LBaas
Ingress:使用开源的反向代理负载均衡器实现服务的发布,例如ingress和nginx、tomcat经常一起发布。

Ingress发布服务原理:
ingress实现服务的发布是通过ingressController实现的。ingressController监听apiserver获取服务状态,通过监听后端的service来动态管理后端的pod服务。
还可以动态注入,监听tsl套接字(openssl)。

具体实现:
首先要为ingressController创建一个namespace
创建成功后,首先创建后端要发布的服务的Service,暴露的Port
创建ingress,在ingress的annotations (注释)里面标注使用的哪个开源服务做的负载均衡+反向代理服务,一般使用nginx。
在spec里,可以写是否使用openssl,如果使用可以加上tsl字段
要定义规则(rules):
可以写虚拟主机,或者url映射。
虚拟主机要在写列表对象,写发布路径,服务名称,服务端口,后端的service。
eg: 虚拟主机

statefulSet:
cattle,pet
PetSet -> sstatefulSet
稳定且唯一的网络标识符;
稳定且持久的存储;
有序优雅的部署和扩展;
有序平滑的删除和终止;
有序的滚动更新;
三个组件: headless、service、StatefulSet、volumeClaimTemplate
可以动态生成pv和pvc
DNS解析 pod_name.servive_name.ns_name.svc.cluster.local
扩缩容是按顺序依次的(创建应该是顺序的,更新或者删除应该是逆序的)
灰度发布:使用setimage来实现,有一个partition(更新区):
partition: N
就是大于N的会被更新

—apiVersion: v1kind: Servicemetadata:
name: nginx
labels:
app: nginxspec:
ports:

  • port: 80
    name: web
    clusterIP: None
    selector:
    app: nginx—apiVersion: apps/v1beta1kind: StatefulSetmetadata:
    name: webspec:
    serviceName: “nginx”
    replicas: 2
    template:
    metadata:
    labels:
    app: nginx
    spec:
    containers:
    • name: nginx
      image: gcr.io/google_containers/nginx-slim:0.8
      ports:
      • containerPort: 80
        name: web
        volumeMounts:
      • name: www
        mountPath: /usr/share/nginx/html
        volumeClaimTemplates:
  • metadata:
    name: www
    annotations:
    volume.alpha.kubernetes.io/storage-class: anything
    spec:
    accessModes: [ “ReadWriteOnce” ]
    resources:
    requests:
    storage: 1Gi

ServiceAccount:
K8s有两类认证:
1.用户认证,通过kubectl认证
2.通过特定的pod认证,使用资源 serviceaccount,在pod里定义
client —> API server
user: username uid
group:
extra:

API
Request path:
/apis/apps/v1/namespaces/default/myapp-deploy
HTTP request verb:
get.post.put.delete
API requests verb:
get,list,patch,watch,create,update,proxy,delete,deletecollection,redirect
Resource:
Subresource:
Namespace:
API group:

https://www.cnblogs.com/dribs/p/10313286.html

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

so_defficult

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值