文章目录

[1] kubernetes 概述

[1.1] kubernetes 是什么

[1.2] kubernetes 特性

[1.3] kubernetes 集群架构与组件

[1.4] kubernetes核心概念

[2] kubernetes集群部署

[2.1.官方提供的三种部署方式 ]

[2.2.Kubernetes平台环境规划 ]

[2.3.自签SSL证书]

[2.4.Etcd数据库集群部署]

[2.5. Node安装Docker]

[2.6.部署Kubernetes网络]

[2.7.部署Master组件]

[2.8.部署Node组件]

[2.9.部署一个测试示例]

[2.10.部署Web UI(Dashboard)]

[2.11.部署集群内部DNS解析服务(CoreDNS)]

[3] kubectl命令行管理工具

3.1.[kubectl管理命令概要]

3.2.[kubectl管理应用程序生命周期]

3.3[kubectl远程连接K8S集群]

[4] 深入理解Pod对象

4.1. [Pod容器分类]

4.2. [镜像拉取策略]

#镜像有三种拉取策略:

• IfNotPresent:默认值,镜像在宿主机上不存在时才拉取
• Always:每次创建 Pod 都会重新拉取一次镜像
• Never: Pod 永远不会主动拉取这个镜像

 1、配置镜像拉取策略为默认,配置镜像拉取地址
spec:
   containers:
   - image: nginx:1.17
     imagePullPolicy: IfNotPresent   
   imagePullSecrets:
     - name: myregistrykey
#

#创建镜像拉取的凭证
kubectl create secret docker-registry myregistrykey --docker-username=admin --docker-password=Harbor12345 --docker-email=admin@163.com --docker-server="148.153.22.12"
secret/myregistrykey created

#查看镜像拉取的认证文件
[root@master ~]# kubectl get secret   
myregistrykey    

4.3. [资源限制]

apiVersion: v1
kind: Pod
metadata:
  name: frontend
spec:
  containers:
  - name: db
    image: mysql:5.7
    resources:
      requests:
        memory: "64Mi"
        cpu: "250m"
      limits:
        memory: "128Mi"
        cpu: "500m"
  - name: wp
    image: wordpress
    resources:
      requests:
        memory: "64Mi"
        cpu: "250m"
      limits:
        memory: "128Mi"
        cpu: "500m"

以上是搭建的wordpress,并做了cpu和内存的限制

4.4. [重启策略]

• Always:当容器终止退出后,总是重启容器,默认策略。
• OnFailure:当容器异常退出(退出状态码非0)时,才重启容器。
• Never:当容器终止退出,从不重启容器。

apiVersion: v1
kind: Pod
metadata:
  name: my-deploy2
spec:
  nodeSelector:
    env_role: dev
  containers:
  - name: my-deploy2
    image: nginx
  restartPolicy: Always
status: {}

4.5. [健康检查Probe]

Probe有以下两种类型:
 livenessProbe
如果检查失败,将杀死容器,根据Pod的restartPolicy来操作。
 readinessProbe
如果检查失败,Kubernetes会把Pod从service endpoints中剔除。

Probe支持以下三种检查方法:
 httpGet
发送HTTP请求,返回200-400范围状态码为成功。
 exec
执行Shell命令返回状态码是0为成功。
 tcpSocket
发起TCP Socket建立成功
apiVersion: v1
kind: Pod
metadata:
  labels:
    test: liveness
  name: liveness-exec
spec:
  containers:
  - name: liveness
    image: k8s.gcr.io/busybox
    args:
      - /bin/sh
      - -c
      - touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 600
     livenessProbe:
      exec:
        command:
          - cat
          - /tmp/healthy
        initialDelaySeconds: 5
        periodSeconds: 5

探测的方法是:通过 cat 命令检查 /tmp/healthy 文件是否存在。如果命令执行成功,返回值为零,Kubernetes 则认为本次 Liveness 探测成功;如果命令返回值非零,本次 Liveness 探测失败。

initialDelaySeconds: 5 指定容器启动 5 之后开始执行 Liveness 探测,我们一般会根据应用启动的准备时间来设置。比如某个应用正常启动要花 30 秒,那么 initialDelaySeconds 的值就应该大于 30。

periodSeconds: 5 指定每 5 秒执行一次 Liveness 探测。Kubernetes 如果连续执行 3 次 Liveness 探测均失败,则会杀掉并重启容器。

具体后面再yml里再详细介绍!

详情参考此文:https://blog.csdn.net/wenjianfeng/article/details/93370906

4.6. [调度流程与调度约束]

在这里插入图片描述
k8s各个组件与api-server通过list-watch机制通信

解释上图:
用户会把创建pod任务交给apiserver,apiserver会写入etcd中,etcd存储完成,apiserver会响应一个事件,scheduler会通过watch机制获取到这个事件,并根据调度算法选出绑定的node并返回给apiserver,apiserver把事件和数据写到etcd中,kubelet在node节点上会监听到此事件,并和pod做绑定,随即调用docker创建pod,创建完成后kubelet会获取到pod 的状态,并将此信息反馈apiserver,apiserver将此信息写到etcd中。

#查看node
[root@master ~]# kubectl get nodes
NAME          STATUS   ROLES    AGE     VERSION
10.240.13.4   Ready    <none>   8d      v1.13.4
10.240.13.5   Ready    <none>   7d23h   v1.13.4

#为node打上相关标签
kubectl label nodes 10.240.13.4 env_role=dev
kubectl label nodes 10.240.13.5 env_role=prod

#查看node的标签
kubectl get nodes --show-labels

#创建pod
vim my_pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: my-deploy
spec:
  nodeSelector:
    env_role: dev
  containers:
  - name: my-deploy
    image: nginx
status: {}

#执行创建
kubectl apply -f my_pod.yaml

#查看
kubectl get pods -o wide
NAME                    READY   STATUS             RESTARTS   AGE   IP            NODE          NOMINATED NODE   READINESS GATES
my-deploy               1/1     Running            0          16m   172.17.28.3   10.240.13.4   <none>           <none>

4.7. [故障排查]

在这里插入图片描述

pod已经创建到kubernetes,在创建过程中是 pending状态
pod已经绑定到一个节点,并创建所有容器,至少一个运行,running状态
pod中所有容器都已终止,不会重新启动,successed状态
pod的所有容器均已终止,容器以非0状态退出  failed状态
未知  unknown状态

kubectl describe pod/nginx-7cccd4bdff-9d797 #pod信息,和详细事件
kubectl logs pod/nginx-7cccd4bdff-9d797 #通过logs查看pod的日志
kubectl exec -it nginx-7cccd4bdff-9d797 bash #通过exec 进入pod容器的 bash控制台

[5] 控制器

前言 Pod与controllers的关系
  • controllers:在集群上管理和运行容器的对象
  • 通过label-selector相关联
  • Pod通过控制器实现应用的运维,如伸缩,升级等
    在这里插入图片描述

5.1. [Deployment]

部署无状态应用
管理Pod和ReplicaSet
具有上线部署、副本设定、滚动升级、回滚等功能
提供声明式更新,例如只更新一个新的Image

应用场景:Web服务、微服务

apiVersion: apps/v1beta2   #版本
kind: Deployment    #资源对象名称
metadata:        #元数据,指定deployment 名称,命名空间,标签
    labels:
      app: nginx
    name: nginx
spec:  #具体控制器和容器的选项配置
  replicas: 3   #副本数量
  selector:     #选择器
    matchLabels:     # 匹配标签,
      app: nginx

  template:    #模板
    metadata:   #pod的元数据
      labels:    #pod的标签
        app: nginx    #标签名
    spec:        #控制器
      containers:    #设置容器
      - name: nginx    #容器名
        image: nginx:1.10   #镜像
        ports:      #端口
        - containerPort: 80    #80
#复制粘贴请注意格式

5.2. [StatefulSet]

5.3. [DaemonSet]

在每个Node上运行一个Pod
新加入的Node也同样会自动运行一个Pod

应用场景:Agent

apiVersion: apps/v1beta2   #版本
kind: DaemonSet    #资源对象名称
metadata:        #元数据,指定deployment 名称,命名空间,标签
    name: agent
    namespace: default
spec:  #具体控制器和容器的选项配置
  selector:     #选择器
    matchLabels:     # 匹配标签,
      app: agent

  template:    #模板
    metadata:   #pod的元数据
      labels:    #pod的标签
        app: agent    #标签名
    spec:        #控制器
      containers:    #设置容器
      - name: nginx    #容器名
        image: nginx:1.10   #镜像
        ports:      #端口
        - containerPort: 80    #80
[root@master k8s-config]# kubectl get pods -o wide
NAME                               READY   STATUS              RESTARTS   AGE     IP             NODE          NOMINATED NODE   READINESS GATES
agent-59q4c                        1/1     Running             0          30m     172.17.30.11   10.240.13.5   <none>           <none>
agent-ptb6n                        1/1     Running             0          30m     172.17.28.2    10.240.13.4   <none>           <none>

#可以看到agent 已经在各个node创建了

5.4. [Job]

Job分为普通任务(Job)和定时任务(CronJob)
一次性执行
应用场景:离线数据处理,视频解码等业务

apiVersion: batch/v1
kind: Job
metadata:
  name: pi
spec:
  template:
    spec:
      containers:
      - name: pi
        image: perl
        command: ["perl",  "-Mbignum=bpi", "-wle", "print bpi(2000)"]
      restartPolicy: Never
  backoffLimit: 4

在这里插入图片描述

5.5. [CronJob]

定时任务,像Linux的Crontab一样。
• 定时任务
应用场景:通知,备份

vim CronJob.yml

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: hello
spec:
  schedule: "*/1 * * * *"
  jobTemplate:
    spec:
      template:
       spec:
         containers:
         - name: hello
           image: busybox
           args:
           - /bin/sh
           - -c
           - date; echo Hello from the Kubernetes cluster
         restartPolicy: OnFailure

在这里插入图片描述
#可以看到hello已经打印

[5.6] 配置管理

  • Secert
    加密数据存放在ETCD中,让Pod容器以挂载Volume方式访问
    Pod使用secret两种方式:
    变量注入
    挂载
    应用场景:凭据,认证信息

变量注入方式 vim Secert-vol.yml

apiVersion: v1
kind: Secret
metadata:
  creationTimestamp: 2016-01-22T18:41:56Z
  name: mysecret
  namespace: default
  resourceVersion: "164619"
  uid: cfee02d6-c137-11e5-8d73-42010af00002
type: Opaque
data:
  username: YWRtaW4=
  password: MWYyZDFlMmU2N2Rm
---
apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  containers:
  - name: nginx
    image: nginx
    env:
      - name: SECRET_USERNAME
        valueFrom:
          secretKeyRef:
            name: mysecret
            key: username
      - name: SECRET_PASSWORD
        valueFrom:
          secretKeyRef:
            name: mysecret
            key: password
测试方法:
1、登录到pod里
kubectl exec -it mypod bash
2、输入以下命令可以查看在上面注入的变量
echo $SECRET_USERNAME
echo $SECRET_PASSWORD

挂载,让pod容器以挂载volume的方式访问 vim secert-path.yml

apiVersion: v1
kind: Secret
metadata:
  creationTimestamp: 2016-01-22T18:41:56Z
  name: mysecret
  namespace: default
  resourceVersion: "164619"
  uid: cfee02d6-c137-11e5-8d73-42010af00002
type: Opaque
data:
  username: YWRtaW4=
  password: MWYyZDFlMmU2N2Rm

---
apiVersion: v1
kind: Pod
metadata:
  name: mypod2
spec:
  containers:
  - name: nginx
    image: nginx
    volumeMounts:
    - name: foo
      mountPath: "/etc/foo"
      readOnly: true
  volumes:
  - name: foo
    secret:
      secretName: mysecret
测试:
1、登录到pod里
kubectl exec -it mypod bash
2、输入以下命令可以查看挂载的文件
 cat /etc/foo/username
 cat /etc/foo/password
  • Configmap
apiVersion: v1
kind: ConfigMap
metadata:
  name: myconfig
  namespace: default
data:
  special.level: info
  special.type: hello

---

apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  containers:
    - name: busybox
      image: busybox
      command: [ "/bin/sh", "-c", "echo $(LEVEL) $(TYPE)" ]
      env:
        - name: LEVEL
          valueFrom:
            configMapKeyRef:
              name: myconfig
              key: special.level
        - name: TYPE
          valueFrom:
            configMapKeyRef:
              name: myconfig
              key: special.type
  restartPolicy: Never


---

apiVersion: v1
kind: ConfigMap
metadata:
  name: redis-config
data:
  redis.properties: |
    redis.host=127.0.0.1
    redis.port=6379
    redis.password=123456

---

apiVersion: v1
kind: Pod
metadata:
  name: mypod2
spec:
  containers:
    - name: busybox
      image: busybox
      command: [ "/bin/sh","-c","cat /etc/config/redis.properties" ]
      volumeMounts:
      - name: config-volume
        mountPath: /etc/config
  volumes:
    - name: config-volume
      configMap:
        name: redis-config
  restartPolicy: Never

测试:
1、
[root@master k8s-config]# kubectl logs mypod2
redis.host=127.0.0.1
redis.port=6379
redis.password=123456
[root@master k8s-config]# kubectl logs mypod
info hello

[5.7] Service - 与外界连通

service存在的意义

防止Pod关联(服务发现)
定义一组Pod的访问策略(负载均衡)
支持ClusterIP,NodePort以及loadBalancer三种类型
service的底层实现主要有iptables和ipvs二种网络模式

5.7.1 Pod与Service的关系

通过label-selector相关联
通过service实现pod的负载均衡(TCP/udp 4层)
在这里插入图片描述

5.7.2 Service类型

在这里插入图片描述
在这里插入图片描述

5.7.3 Service代理模式

iptables
灵活,功能强大
规则遍历匹配和更新,呈线性时延
可扩展性

IPVS
工作在内核态,有更好的性能
调度算法丰富: rr,wrr,lc,wlc,ip hash等等

在这里插入图片描述
nodeport 访问流程
client > lb(api-server) > nodeport/service > iptables/ipvs >pod >container

5.7.4 DNS

DNS服务监视Kubernetes API,为每一个Service创建DNS记录用于域名解析。
ClusterIP A记录格式:..svc.cluster.local
示例:my-svc.my-namespace.svc.cluster.local

https://github.com/kubernetes/kubernetes/tree/master/cluster/addons/dns/coredns #参考此文档

在这里插入图片描述
将此文件内容复制到coredns.yaml文件
使用 kubectl apply -f coredns.yaml 创建
使用kubectl get pods -n kube-system 查看

5.8 Ingress

5.8.1 Pod与Ingress的关系

在这里插入图片描述
ingress访问流程
client > lb > ingress controller(nginx) > service > pod >container

通过label-selector相关联
通过Ingress Controller实现Pod的负载均衡

  • 支持TCP/UDP 4层和HTTP 7层

5.8.2 Ingress Controller

在这里插入图片描述
部署文档:https://github.com/kubernetes/ingress-nginx/blob/master/docs/deploy/index.md

注意事项:
• 镜像地址修改成国内的:lizhenliang/nginx-ingress-controller:0.20.0
• 使用宿主机网络:hostNetwork: true
在这里插入图片描述

5.8.3 Ingress(HTTP与HTTPS)

[5] 将公司项目部署到Kubernetes平台中

5.1. [准备工作与注意事项]

5.2. [准备基础镜像并推送到镜像仓库]

5.3. [在K8S中部署PHP项目]

5.4. [在K8S中部署Java项目]

[6] 使用Prometheus全方位监控Kubernetes

6.1. [K8S监控指标]

6.2. [Prometheus是什么]

6.3. [Prometheus组件及架构]

6.4. [Prometheus数据模型]

6.5. [Prometheus监控K8S架构]

6.6. [在K8S中部署Prometheus]

6.7. [监控K8S集群Node]

6.8. [在K8S中部署Grafana与可视化]

6.9. [监控K8S集群中Pod与资源对象]

6.10.[在K8S中部署Alertmanager]

6.11.[告警规则与告警通知]

[7] 使用ELK Stack收集Kubernetes平台中日志与可视化

7.1. [收集哪些日志]

7.2. [日志方案]

7.3. [容器中的日志怎么收集]

[8] 资源扩容

8.1. [Master扩容]

8.2. [Node扩容]

8.3. [Pod扩容/缩容]

[9] 项目发布方案

9.1. [蓝绿发布]

9.2. [灰度发布]

9.3. [滚动发布]

9.4. [Kubernetes中的滚动更新]

[10] 基于Kubernetes构建企业Jenkins CI/CD平台

10.1. [发布流程设计]

10.2. [部署Harbor镜像仓库]

10.3. [部署Git仓库]

10.4. [构建Jenkins-Slave镜像]

10.5. [在Kubernetes中部署Jenkins]

10.6. [Jenkins与Kubernetes集成]

10.7. [流水线发布Java项目]

10.8. [回滚]

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐