从零开始学习k8s

4 篇文章 1 订阅

文章目录

[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. [回滚]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
从零开始搭建一个 Kubernetes(简称K8s)集群可以按照以下步骤进行: 1. 选择操作系统:选择适合你的需求的操作系统,比如Ubuntu、CentOS等。 2. 安装DockerKubernetes使用Docker容器来运行应用程序,因此需要先安装Docker。可以通过官方文档来安装适合你操作系统版本的Docker。 3. 安装Kubernetes的控制节点(Master):在控制节点上安装Kubernetes的各个组件,包括kube-apiserver、kube-controller-manager、kube-scheduler等。可以通过二进制文件手动安装,或者使用Kubeadm工具来简化安装过程。 4. 配置网络:配置网络使得集群内的各个节点能够相互通信。可以选择使用Flannel、Calico等网络插件来实现网络配置。 5. 添加工作节点(Worker):在工作节点上安装DockerKubernetes的各个组件,比如kubelet和kube-proxy。可以使用同样的方式安装DockerKubernetes组件。 6. 加入工作节点到集群:在控制节点上使用Kubeadm工具将工作节点加入到集群中。 7. 部署应用程序:通过Kubernetes的资源对象(如Pod、Service、Deployment等)来部署应用程序。可以使用kubectl命令行工具或者YAML文件来定义和创建这些资源对象。 以上是一个大致的搭建Kubernetes集群的步骤,具体的安装和配置过程可能会因为操作系统和版本的不同而有所差异。你可以参考官方文档或者一些教程来获取更详细的指导。同时,搭建Kubernetes集群需要一定的系统管理和网络知识,确保你有足够的了解和准备。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

duan737174646

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

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

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

打赏作者

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

抵扣说明:

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

余额充值