路漫漫其修远兮
吾将上下而求索

k8s学习:马哥k8教程

下面的教程也不错
https://jimmysong.io/kubernetes-handbook/concepts/deployment.html

容器 Kubernetes 视频教程全集(36P)- 46 小时从入门到精通 (P11. 11. 01-Devops核心要点及kubernetes架构概述)

docker-compose多适用于单个机器上多容器编排,而不适用多个机器
Devops:开发运维
MicroServices:微服务
CI:持续集成,研发-测试-构建成镜像-推到harber
CD:持续交付 delivery
CD:持续部署 Deployment,部署到线上-灰度发布-扩容-回退等

k8s 
master:一般只需要3个节点,需要高可用 
work:运行容器等操作

kube-scheduler:运行容器前,有哪些节点符合预选,哪些符合优选,是否有足够内存,cpu,是否有特定要求
kube-controller-manager:负责监控每个容器是否健康,若挂了,告诉apiserver,发给scheduler重新建一个
kube-proxy:pod地址发生改变,负责将地址反应在iptables或者ipvs上和service对应起来
etcd:共享存储,高可用,存储上面的各数据

pod是k8s里面最小运行单元,pod是容器抽象的封装,一个pod中可以运行多个容器,多个容器共享网络空间,存储卷。pod模拟一个独立的虚机,一般一个pod只放一个容器



容器 Kubernetes 视频教程全集(36P)- 46 小时从入门到精通 (P12. 12. 02-kubernetes基础概念)
pod的管理有:
	自主式pod,需要用监控保证存活
	控制器管理的pod:
		replicationcontrollers
		replicasets

节点网络是一个网络
service地址是假的,叫做集群网络
pod的地址是真的,叫做pod网络


同一个pod内的多个容器间通信:lo网卡通信
各pod之间通信,每个主机上一个子段,可直接通信。pod和pod一般不直接通信,因为ip会随时变动。pod一般都是和service通信,serviceip是固定的
pod与service之间通信,iptables或者ipvs
k8s示意图!!!!!!!!!!!




容器 Kubernetes 视频教程全集(36P)- 46 小时从入门到精通 (P13. 13. 03-kubeadm初始化Kubernetes集群)
kubeadmin安装,不建议




容器 Kubernetes 视频教程全集(36P)- 46 小时从入门到精通 (P14. 14. 04-kubernetes应用快速入门)
下面的命令会生成deployment,要删除必须删除deployment才可以,删除pod会重建
kubectl run nginx-test --image=harbor.andblog.com/test/nginx:0.1 --port=80 --replicas=1
kubectl get deployment -o wide
kubectl describe pod nginx-689fc5975c-zhnm8
pod运行在 192.168.3.9上面,可以直接使用curl命令来访问

只有在pod所在的机器运行pod的时候,才会去拉镜像到本机,没有运行的不会拉取。导致如果运行的pod多,每个机器都会拉取一次镜像,占带宽

把端口映射出去,这样外网可以访问,将现有的deployment导出为一个服务
kubectl expose deployment nginx-test --name=nginx-test --port=30080 --target-port=80 --protocol=TCP
service_ip:service:port -> pod_ip:pod_port
将80端口暴露到service的30080端口,这样集群内部都可以通过service_ip来访问

查看dns的服务ip
kubectl get svc -n kube-system
dig nginx.default.svc.cluster.local @10.254.0.2  可以查看到当前nginx服务的dns解析为实际的服务ip
nginx.default.svc.cluster.local. 5 IN   A       10.254.78.97


运行一个容器进行测试
kubectl run client --image=busybox --replicas=1 -it --restart=Never
/ # cat /etc/resolv.conf   这里会自动将dns地址改为dns服务器的
nameserver 10.254.0.2
search default.svc.cluster.local svc.cluster.local cluster.local   

在容器里面可以直接使用这个域名来访问nginx服务
/ # wget nginx:30080


当启动4个pod作为后端的时候,看描述会有4个endpoints
[root@k8s-test-1 ~]#kubectl describe svc nginx-test 
Name:              nginx-test
Namespace:         default
Labels:            run=nginx-test
Annotations:       <none>
Selector:          run=nginx-test
Type:              ClusterIP
IP:                10.254.87.108
Port:              <unset>  30080/TCP
TargetPort:        80/TCP
Endpoints:         192.168.3.10:80,192.168.3.7:80,192.168.3.8:80 + 1 more...
Session Affinity:  None
Events:            <none>

将nginx扩展到16个副本
kubectl scale --replicas=16 deployment nginx-test

升级pod,滚动升级
kubectl set image deployment nginx-test nginx-test=ikubernetes/myapp:v2 

实时查看升级过程
kubectl rollout status deployment nginx-test

回滚到上一个版本
kubectl rollout undo deployment nginx-test



容器 Kubernetes 视频教程全集(36P)- 46 小时从入门到精通 (P15. 15. 05-kubernetes资源清单定义入门)
https://www.cnblogs.com/klvchen/p/9901514.html


查看具体字段说明
kubectl explain pods.metadata 



容器 Kubernetes 视频教程全集(36P)- 46 小时从入门到精通 (P16. 16. 06-Kubernetes Pod控制器应用进阶)
查看具体的参数定义
kubectl explain pods.spec.containers
	-name <string>
	 image <string>
	 imagePullPoliy <string>
		Always, Never, IfNotPresent(如果不存在,从远处拉取)

label的使用 	
https://jimmysong.io/kubernetes-handbook/concepts/label.html
kubectl get pod -l 'app=myapp' -o wide --show-labels    
给已有的pod打标签
kubectl label pods pod-demo release=canary
覆盖以前的标签
kubectl label pods pod-demo release=stable --overwrite

将某个pod限制在某个节点
kubectl explain pods.spec

nodeSelector:
  disktype: ssd



容器 Kubernetes 视频教程全集(36P)- 46 小时从入门到精通 (P17. 17. 07-Kubernetes Pod控制器应用进阶)

探针类别
https://jimmysong.io/kubernetes-handbook/concepts/pod-lifecycle.html#%E5%AE%B9%E5%99%A8%E6%8E%A2%E9%92%88
探针示例
可以在描述中查看具体的探针描述信息

java容器运行时,不是pod显示就绪后就一定是就绪的,需要使用readinessProbe来检测是否就绪,就绪了才会标记为就绪状态,未就绪的话,
service不会将其关联到后端,用户请求不会到这里

下面是一个示例
apiVersion: v1 
kind: Pod 
metadata:
  name: readiness-httpget-pod 
  namespace: default
spec:
  containers:
  - name: readiness-httpget-container 
    image: ikubernetes/myapp:v1 
	imagePullPoliy: IfNotPresent 
	ports:
	- name: http 
	  containerPort: 80
	readinessProbe:
	  httpGet:
	    port: http 
		path: /index.html 
	  initialDelaySeconds: 1
	  periodSeconds: 3

启动前和终止前钩子
kubectl explain pods.spec.containers.lifecycle.postStart
https://jimmysong.io/kubernetes-handbook/concepts/pod-hook.html




容器 Kubernetes 视频教程全集(36P)- 46 小时从入门到精通 (P18. 18. 08-Kubernetes Pod控制器)
https://jimmysong.io/kubernetes-handbook/concepts/controllers.html
主要介绍这里面的控制器

deployment用来将pod数量维持在定义的数量上
daemonset 可以保证特定的pod只运行在每个node上面,而且只运行一个pod,通常是filebeat进程收集某个节点的所有日志

查看deployment帮助
kubectl explain rs.spec

apiVersion: extensions/v1beta1
kind: ReplicaSet
metadata:
  name: frontend
spec:
  replicas: 3
  selector:
    matchLabels:
      tier: frontend
    matchExpressions:
      - {key: tier, operator: In, values: [frontend]}
  template:
    metadata:
      labels:
        app: guestbook
        tier: frontend
    spec:
      containers:
      - name: php-redis
        image: ikubernetes/myapp:v1
        resources:
          requests:
            cpu: 100m
            memory: 100Mi
        env:
        - name: GET_HOSTS_FROM
          value: dns
        ports:
        - containerPort: 80

kubectl edit rs frontend
支持动态修改,可以将数量改为5,立即生效



容器 Kubernetes 视频教程全集(36P)- 46 小时从入门到精通 (P19. 19. 09-Kubernetes Pod控制器)

[root@k8s-test-1 /home/andy]#cat deploy-demo.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp-deploy
  namespace: default
spec:
  replicas: 2
  selector:
    matchLabels:
      app: myapp
      release: canary
  template:
    metadata:
      labels:
        app: myapp
        release: canary
    spec:
      containers:
      - name: myapp
        image: ikubernetes/myapp:v1
        ports:
        - name: http
          containerPort: 80
 
可以使用 kubectl apply -f deploy-demo.yaml 来创建,或者修改后使用这个命令重新生效,比如副本数或者镜像版本等

查看滚动历史
kubectl rollout history deployment myapp-deploy 

https://jimmysong.io/kubernetes-handbook/concepts/deployment.html
主要讲里面的可用数量,不可用数量

查看更新过程 kubectl rollout status deployment myapp-deploy 

kubectl rollout pause 暂停更新
kubectl rollout resume 恢复更新

当新镜像生效以后,老的资源还是可用看到的,以防回滚
kubectl get rs -o wide 可用看到老的rs资源


DaemonSet使用
https://jimmysong.io/kubernetes-handbook/concepts/daemonset.html



容器 Kubernetes 视频教程全集(36P)- 46 小时从入门到精通 (P20. 20. 10-kubernetes Service资源)
目的是固定ip,依赖kube-proxy  coredns,方便其他服务访问

https://jimmysong.io/kubernetes-handbook/concepts/service.html

类型有:NodePort和ClusterIP

如果用户想访问容器的端口, 
client -> NodeIP:NodePort -> ClusterIP:ServicePort -> PodIP:containerPort 



容器 Kubernetes 视频教程全集(36P)- 46 小时从入门到精通 (P21. 21. 11-kubernetes ingress及Ingress C
https://jimmysong.io/kubernetes-handbook/concepts/ingress.html

其实就是nginx,放到了容器里面,不然如果用户访问https,得要在pod里面卸载https,把这些工作放到前面进行
部署一个容器来运行nginx,配置如下,进行代理
  rules:
  - host: "*.jimmysong.io"
    http:
      paths:
      - path: /docGenerate
        backend:
          serviceName: td-sdmk-docgenerate
          servicePort: 80


看具体的图片,为什么不是ingress代理到service,service代理到后端的服务?而是只是去service拿后面的ip地址???

安装ingress,需要详细看

添加的yaml文件会自动转换为nginx的配置文件,可以进入容器看到具体的配置文件

部署tomcat,部署ssl



容器 Kubernetes 视频教程全集(36P)- 46 小时从入门到精通 (P22. 22. 12-存储卷)
分类:只在节点本地使用,


emptyDir  的生命周期同pod生命周期,pod删掉就没了
hostPath  挂载到本地目录
nfs  挂载nfs来使用
pvc和pv一一对应,pv是存储卷, 一个pvc可以被多个pod使用
	pv是属于集群的,pvc属于名称空间级别的



定义pv
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv001
  labels:
    name: pv001
spec:
  nfs:
    path: /data/volumes/v1
	server: a.b.com
  accessModes: ["ReadWriteMany", "ReadWriteOnce"]
  capacity:
    storage: 20Gi



定义pvc和pod
apiVersion: v1 
kind: PersistentVolumeClaim
metadata: 
  name: mypvc
  namespace: default
spec:
  accessModes: ["ReadWriteMany"]
  resouces:
    requests:
	  storage: 6Gi
---
apiVersion: v1
kind: Pod
metadata:
  name: pod-vol-pvc
  namespace: default 
spec: 
  containers:
  - name: myapp 
    image: ikubernetes/myapp:v1
	volumeMounts:
	- name: html
	  mountPath: /usr/share/nginx/html/
  volumes:
  - name: html
    persistentVolumeClaim:
	  claimName: mypvc


查看绑定之间的关系
kubectl get pv 
kubectl get pvc 
kubectl describe pod xxx

只要pv在使用,就不能被删除
只要pv,pvc就绪后,pod才能正常工作


pvc在申请的时候不一定就有现成符合条件的pv可以供使用



容器 Kubernetes 视频教程全集(36P)- 46 小时从入门到精通 (P23. 23. 13-kubernetes pv、pvc、configmap和
configmap
许多应用程序会从配置文件、命令行参数或环境变量中读取配置信息。这些配置信息需要与docker image解耦,你总不能每修改一个配置就重做一个image吧
就像平时的程序使用配置中心来使用一样

配置容器化应用的方式:
1、自定义命令行参数 
2、环境文件配到镜像
3、环境变量
4、存储卷 


kubectl explain configmap
kubectl describe configmap -n tech-prod storage-cloud-config
kubectl describe cm -n tech-prod storage-cloud-config
kubectl get configmap -n tech-prod storage-cloud-config -o yaml 
kubectl create cm --help  可以通过命令行进行给值


创建configmap
kubectl create cm nginx-config --from-literal=nginx_port=80 --from-literal=server_name=a.b.com

pod使用configmap,NGINX_SERVER_PORT=80
apiVersion: v1
kind: Pod
metadata:
  name: pod-cm-1
  namespace: default
  labels:
    app: myapp
    tier: frontend
  annotations:
    magedu.com/created-by: "cluster admin"
spec:
  containers:
  - name: myapp
    image: ikubernetes/myapp:v1
    ports:
    - name: http
      containerPort: 80
    env:
    - name: NGINX_SERVER_PORT
      valueFrom:
        configMapKeyRef: 
          name: nginx-config
          key: nginx_port


configmap修改后会pod中不会实时生效,需要重启pod



或者将配置文件以挂载的方式加载到容器的某个目录当中
apiVersion: v1
kind: Pod
metadata:
  name: pod-cm-2
  namespace: default
  labels:
    app: myapp
    tier: frontend
  annotations:
    magedu.com/created-by: "cluster admin"
spec:
  containers:
  - name: myapp
    image: ikubernetes/myapp:v1
    ports:
    - name: http
      containerPort: 80
    volumeMounts:
	- name: nginxconf
	  mountPath: /etc/nginx/config.d/ 
	  readOnly: true 
  volumes:
  - name: nginxconf
    configMap:
	  name: nginx-config

文件名就是键名
kubectl exec -it pod-cm-2 /bin/sh
/ # cd /etc/nginx/config.d/
/etc/nginx/config.d # ls -l
total 0
lrwxrwxrwx    1 root     root            17 Jul 14 07:56 nginx_port -> ..data/nginx_port
lrwxrwxrwx    1 root     root            18 Jul 14 07:56 server_name -> ..data/server_name
/etc/nginx/config.d # cat nginx_port 
80

通过挂载的好处是实时生效,修改端口后,再重新进入容器,会发现端口已经改变了
kubectl edit cm nginx-config    

这里可以将文件内容放到configmap中,通过挂载来配置,比如vhosts里面的文件
但是配置修改后,需要通过某种方式将配置reload之后才能生效


secrete配置
https://jimmysong.io/kubernetes-handbook/guide/secret-configuration.html

kubectl create secret generic mysql-root --from-literal=password=12345
kubectl get secret mysql-root -o yaml 这种方式可以查看到源文件

通过环境变量
apiVersion: v1
kind: Pod
metadata:
  name: secret-env-pod
spec:
  containers:
  - name: mycontainer
    image: redis
    env:
      - name: SECRET_USERNAME
        valueFrom:
          secretKeyRef:
            name: mysecret
            key: username
      - name: SECRET_PASSWORD
        valueFrom:
          secretKeyRef:
            name: mysecret
            key: password
  restartPolicy: Never



容器 Kubernetes 视频教程全集(36P)- 46 小时从入门到精通 (P24. 24. 14-kubernetes statefulset控制器)  
用到再说



容器 Kubernetes 视频教程全集(36P)- 46 小时从入门到精通 (P25. 25. 15-kubernetes认证及serviceaccount)

流程为:api-server -- 认证 -- 授权 -- 准入控制,是否有其他资源权限

apiserver可以通过外部访问到,也可以在集群内部的pod访问到,可以通过集群ip来访问,最后都是到apiserver上面了
kubectl describe svc kubernetes
Name:              kubernetes
Namespace:         default
Labels:            component=apiserver
                   provider=kubernetes
Annotations:       <none>
Selector:          <none>
Type:              ClusterIP
IP:                10.254.0.1
Port:              https  443/TCP
TargetPort:        6443/TCP
Endpoints:         10.216.4.131:6443,10.216.4.14:6443,10.216.4.15:6443
Session Affinity:  None
Events:            <none>

每个名称空间中都有一个默认的secret,作用是这个名称空间中应用访问其他名称空间的服务的令牌,连接apiserver


当用户创建account的时候,会自动生成对应的token供使用来认证,虽然能认证通过,但是做不了其他事情
[root@k8s-test-1 /home/andy]#kubectl create serviceaccount admin 
[root@k8s-test-1 /home/andy]#kubectl get serviceaccount         
NAME               SECRETS   AGE
admin-test         1         16s

[root@k8s-test-1 /home/andy]#kubectl describe serviceaccount admin-test      
Name:                admin-test
Namespace:           default
Labels:              <none>
Annotations:         <none>
Image pull secrets:  <none>
Mountable secrets:   admin-test-token-gm56m
Tokens:              admin-test-token-gm56m
Events:              <none>


https://jimmysong.io/kubernetes-handbook/concepts/rbac.html

未经允许不得转载:江哥架构师笔记 » k8s学习:马哥k8教程

分享到:更多 ()

评论 抢沙发

评论前必须登录!