–
下面的教程也不错 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
–
–
评论前必须登录!
注册