k8s一次应用的创建

165 阅读5分钟

k8s一次应用的创建

k8s 简介

Kubernetes简述

Kubernetes是容器集群管理系统,是一个开源的平台,可以实现容器集群的自动化部署、自动扩缩容、维护等功能。

通过Kubernetes你可以:

  • 快速部署应用
  • 快速拓展应用
  • 快速对接新的应用功能
  • 节省资源(分时共享下)

k8s总体结构

image.png

k8s master 组件

master: 集群的控制节点,负责对集群中所有资源进行管控和调度,它上面运行了etcd,
api-server , controller-manager 和 schedule 等系统组件。


api-server         各类资源的api接口,数据中心
controller-manager 各种controller的管理者,是集群内部的管理控制中心(如Node Controller
                    Replication Controller,Endpoints Controller,Service Account &
                    Token Controllers)
schedule            k8s集群的调度器,主要的任务是监控所有新创建尚未分配到节点上的Pod
                    根据调度规则,选择一个合适的节点去运行。
etcd                存储各种资源对象,支持一致性和高可用的键值对存储组件

k8s node 组件

Node 组件运行在每一个节点上(包括 master 节点和 worker 节点),
负责维护运行中的 Pod 并提供 k8s 运行时环境
(1)kubelet:在API Server上注册节点信息,定期向Master汇报节点资源使用情况,
确保 Pod 中的容器处于运行状态,是Node上的pod管家
(2)kube-proxy: 是一个网络代理程序,运行在集群中的每一个节点上,服务访问,负载均衡,
是实现 k8s Service 的重要部分。在节点上维护网络规则,应用可以在集群内、
集群外正确地与 Pod 进行网络通信。
(3)容器引擎 docker: 创建并运行容器

k8s addons (其他的插件)

网络cni插件: calico flannel等
dns插件: coredns等
代理服务插件: ingress traefik等
监控和日志:  metrics-server prometheus node-exporter grafana kube-state-metrics等

应用快速入门

获取资源

命令 kubectl get <资源名称>

帮助 kubectl get -help

使用 kubectl api-resources 获取支持资源的完整列表。

image.png 获取node资源:

kubectl get node

参数:

  • -o wide 输出格式,常用格式: json | yaml | wide
  • -w 监控输出结果,类似tail命令的-f选项;
  • --show-labels 显示标签;

获取资源的详细信息

kubectl describe node ${nodename}

获取集群信息

image.png 手动部署一个应用

1.手动创建一个控制器 deployment

(1.1) 使用 kubectl 创建一个deployment (kubectl 请求 api-server的api进行创建)

kubectl run nginx-deploy --image=nginx:1.14-alpine --replicas=1 --port=80 -ntest

image.png

参数

nginx-deploy 对应的是 deployment 的 name

--image=nginx:1.14-alpine 对应的是使用的镜像为nginx:1.14-alpine

--replicas=1 实例对应的是副本数 1

--port=80 容器内的应用端口为 80

-ntest 指定'test' 租户

--restart='Always': [Always, OnFailure, Never] pod的策略,遇到问题重启,默认是Always

...

(1.2) 使用 yaml 文件创建一个deployment
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deploy
  namespace: test
  labels:
    run: nginx-deploy
spec:
  replicas: 1
  selector:
    matchLabels:
      run: nginx-deploy
  template:
    metadata:
      labels:
        run: nginx-deploy
    spec:
      containers:
      - name: nginx
        image: nginx:1.14-alpine
        ports:
        - containerPort: 80

执行yaml文件: kubectl apply -f nginx.yaml

(2)查看 deployment 列表

image.png

(3) 查看 ReplicaSet 副本控制器

image.png

(4) 控制器被创建后,然后创建相应的 pod

image.png

(5) 通过 pod ip 访问 容器中的nginx服务

image.png

2.创建一个service

Kubernetes中一个应用服务会有一个或多个实例(Pod),每个实例(Pod)的IP地址由网络插件动态随机分配。service 资源 屏蔽了这些后端实例的动态变化和对多实例的负载均衡。

(1.1) 使用bebectl 创建一个service

image.png

deployment nginx-deploy 指定deployment 资源,并且名称为nginx-deploy

--port service暴露的端口

--target-port 容器内的目标端口

--protocol 协议类型 tcp udp

--type=ClusterIP service的类型 ClusterIP, NodePort, LoadBalancer, or ExternalName

(1.2) yaml 创建

apiVersion: v1
kind: Service
metadata:
  labels:
    run: nginx-deploy
  name: nginx-deploy
  namespace: test
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  selector:
    run: nginx-deploy

执行yaml文件: kubectl apply -f nginx-svc.yaml

(2) 获取 service 列表

image.png

通过 service IP 访问 nginx 应用

image.png

(3) 启动一个其他的应用,通过service name 去访问

kubectl run other-cli -it --image=busybox --replicas=1 --restart=Never -ntest

wget nginx-deploy

image.png

(4)跨命名空间访问 应用

{服务名}.{命名空间}.svc.cluster.local

wget nginx-deploy.test.svc.cluster.local

image.png

3.动态扩容,缩容pod副本

(1)先创建一个应用,副本数为2

kubectl run nginx-test --image=nginx:1.14-alpine --replicas=2 --port=80 -ntest

(2)查看应用

image.png

(3)为应用创建 service

kubectl expose deployment nginx-test --name=nginx-test --port=80 -ntest

(4)查看service服务

image.png

endpoint 资源是通过service自动生成的

endpoint 信息发现有两个 pod 的ip信息,故svc资源可以做负载均衡,访问service name或者cluster ip 均会负载到两个ip上

(5)将应用实例扩容为5个。

kubectl scale deployment nginx-test --replicas=5 -ntest

(6)查看pod和svc信息

image.png

(7)将应用缩容为 3 个

kubectl scale deployment nginx-test --replicas=3 -ntest

4.滚动更新

(1)升级nginx-test 的镜像版本 nginx:1.14.2

kubectl set image deployment nginx-test nginx-test=nginx:1.14.2 -ntest

image.png

(2)查看 滚动更新的状态

image.png

(3)查看pod内镜像版本

kubectl describe po nginx-test-7bf5988765-bh57f -ntest

image.png

5.动态回滚

默认回滚至上一版本

kubectl rollout undo deployment nginx-test -ntest

image.png

6.集群外部访问应用

修改service 的类型 为nodeport 即可

(1)查看 修改后 service 类型

image.png

在集群中每个节点上都会开启一个30171端口(这个端口是随机生成的),

映射到K8S集群的nginx-test service的80端口。可自行在其它节点验证。

可在任意的k8s节点通过 netstat -tunlp 查询到此端口。

(2)也可通过 Ingress 和 traefik 配置ingress资源进行访问。

一次pod的调度:

image.png

跨租户的域名解析

image.png