入门Kubernetes

Posted One To One

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了入门Kubernetes相关的知识,希望对你有一定的参考价值。

前言:

 之前文章 对Kubernetes 的一些基础概念及在windows下的环境搭建,接下来把.Net Core 运行到Kubernetes 中,在实际的操作中,对Kubernetes 的进一步学习了解。

一、程序准备

 1、创建.net core 项目,修改Index页面显示当前ip和机器名:

public class IndexModel : PageModel
{
    public string HostName { get; set; }

    public string HostIP { get; set; }
    /// <summary>
    /// 获取机器名和IP地址
    /// </summary>
    public void OnGet()
    {
        HostName = Dns.GetHostName();
        HostIP = Dns.GetHostEntry(HostName).AddressList.FirstOrDefault(x => x.AddressFamily == AddressFamily.InterNetwork).ToString();
    }
}

 2、运行效果如下:

 

  3、创建创建镜像并推送到docker hub中:

  

  接下来,就开始将该镜像部署到k8s中 

二、部署到Kubernetes 

 1、在部署前先介绍个重要概念:Pod

Pod 是可以在 Kubernetes 中创建和管理的、最小的可部署的计算单元。

Pod 是一组(一个或多个)容器; 这些容器共享存储、网络、以及怎样运行这些容器的声明。 Pod 中的内容总是并置(colocated)的并且一同调度,在共享的上下文中运行。 Pod 所建模的是特定于应用的“逻辑主机”,其中包含一个或多个应用容器, 这些容器是相对紧密的耦合在一起的。 在非云环境中,在相同的物理机或虚拟机上运行的应用类似于 在同一逻辑主机上运行的云应用。

除了应用容器,Pod 还可以包含在 Pod 启动期间运行的 Init 容器。 你也可以在集群中支持临时性容器 的情况下,为调试的目的注入临时性容器。

 

Pod 的共享上下文包括一组 Linux 名字空间、控制组(cgroup)和可能一些其他的隔离 方面,即用来隔离 Docker 容器的技术。 在 Pod 的上下文中,每个独立的应用可能会进一步实施隔离。

就 Docker 概念的术语而言,Pod 类似于共享名字空间和文件系统卷的一组 Docker 容器。

  a)创建Pod,运行镜像:k8sdemoweb Pod定义文件:k8sdeomweb-pod.yaml

apiVersion: v1
kind: Pod # 定义Kubernetes资源的类型为Pod
metadata:
  name: k8sdemoweb # 定义资源的名称
  labels: # 为Pod贴上标签(用于Services选择)
    app: k8sdemoweb 
spec: # 定义资源的状态,对于Pod来说,最重要属性就是containers
  containers: # containers一个数组类型,如果你希望部署多个容器,可以添加多项
    - name: web # 定义本Pod中该容器的名称
      image: cwsheng/k8sdemoweb  # 定义Pod启动的容器镜像地址
      ports:
        - containerPort: 80 # 定义容器监听的端口(与Dockerfile中的EXPOSE类似,只是为了提供文档信息)

  b)创建Pod,进入命令行执行:

kubectl create -f k8sdeomweb-pod.yaml

# 输出
# pod/k8sdeomweb created

  c)查看Pod列表:

kubectl get pods

# 输出
# NAME                           READY   STATUS    RESTARTS   AGE
# k8sdemoweb                     1/1     Running   0          40s

  d)本地访问:端口转发(端口转发的方式只能在本机访问,为了从外部访问应用程序,我们需要创建Kubernetes中的另外一种资源:Service。

kubectl port-forward k8sdemoweb 8180:80

# 输出
# Forwarding from 127.0.0.1:8180 -> 80

  

  2、支持外部访问应用,Service 实现

将运行在一组 Pods 上的应用程序公开为网络服务的抽象方法。

使用 Kubernetes,你无需修改应用程序即可使用不熟悉的服务发现机制。 Kubernetes 为 Pods 提供自己的 IP 地址,并为一组 Pod 提供相同的 DNS 名, 并且可以在它们之间进行负载均衡。

  a)定义Service:为k8sdemoweb pod创建Service

apiVersion: v1
kind: Service # 定义Kubernetes资源的类型为Service
metadata:
  name: k8sdemoweb-service # 定义资源的名称
spec:
  selector: # 指定对应的Pod
    app: k8sdemoweb # 指定Pod的标签为k8sdemoweb
  ports:
  - protocol: TCP # 协议类型
    port: 80 # 指定Service访问的端口
    targetPort: 80 # 指定Service转发请求的端口
    nodePort: 31000
  type: NodePort # 指定Service的类型,在这里使用NodePort来对外访问

  b)执行命令:

kubectl create -f k8sdemoweb-service.yaml

#输出:
#service/k8sdemoweb-service created

 3、Pod自动创建实现:Deployment

Deployment表示用户对Kubernetes集群的一次更新操作。可以是创建一个新的服务或是更新一个新的服务,也可以是滚动升级一个服务。

Deployment可以帮助每一个应用程序的生命都保持相同的一点:那就是变化。此外,只有挂掉的应用程序才会一尘不变,否则,新的需求会源源不断地涌现,更多代码会被开发出来、打包以及部署,这个过程中的每一步都有可能出错。

Deployment可以自动化应用程序从一版本升迁到另一版本的过程,并保证服务不间断,如果有意外发生,它可以让我们迅速回滚到前一个版本。

  a)创建:Deployment。添加文件:k8sdemoweb-deployment.yaml

apiVersion: apps/v1
kind: Deployment # 定义Kubernetes资源的类型为Deployment
metadata:
  name: k8sdemoweb-deployment # 定义资源的名称
  labels:
    app: k8sdemoweb-deployment
spec:  # 定义资源的状态。
  replicas: 2 # 定义我们想运行多少个Pod,在这里我们希望运行2个
  selector:
    matchLabels: # 定义该部署匹配哪些Pod
      app: k8sdemoweb
  minReadySeconds: 5 # 可选,指定Pod可以变成可用状态的最小秒数,默认是0
  strategy: # 指定更新版本时,部署使用的策略
    type: RollingUpdate # 策略类型,使用RollingUpdate可以保证部署期间服务不间断
    rollingUpdate:
      maxUnavailable: 1 # 部署时最大允许停止的Pod数量(与replicas相比)
      maxSurge: 1 # 部署时最大允许创建的Pod数量(与replicas相比)
  template: # 用来指定Pod的模板,与Pod的定义类似
    metadata:
      labels: # 根据模板创建的Pod会被贴上该标签,与上面的matchLabels对应
        app: k8sdemoweb
    spec:
      containers:
        - name: web
          image: cwsheng/k8sdemoweb
          imagePullPolicy: Always # 默认是IfNotPresent,如果设置成Always,则每一次部署都会重新拉取容器映像(否则,如果本地存在指定的镜像版本,就不会再去拉取)
          ports:
            - containerPort: 80

  b)执行命令:

kubectl create -f k8sdemoweb-deployment.yaml

  c)查看Pod列表:

PS F:\\coding\\project\\k8s.demo\\k8s> kubectl get pod
NAME                                     READY   STATUS    RESTARTS   AGE
k8sdemoweb                               1/1     Running   0          98m
k8sdemoweb-deployment-8678f7975c-cq2cq   1/1     Running   0          34s
k8sdemoweb-deployment-8678f7975c-jwnlf   1/1     Running   0          34s

总结:

 以上简单的使用了k8s中:Pod、Service、Deployment实现了.net core 部署到k8s中。本次使用也是相对简单的,但k8s还有很多有用的功能等着解锁。如:不停机升级部署、服务间调用。

 

以上是关于入门Kubernetes的主要内容,如果未能解决你的问题,请参考以下文章

kubernetes1.4简介和安装部署

kubernetes1.4简介和安装部署

Terraform入门教程,示例展示管理Docker和Kubernetes资源

Kubernetes——Kubernetes资源管理+Kubernetes实战入门

Kubernetes——Kubernetes资源管理+Kubernetes实战入门

Docker Kubernetes k8s 从入门到精通