半小时学会在Win10上部署K8S,玩转云原生全干货,建议收藏

Posted 麒思妙想

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了半小时学会在Win10上部署K8S,玩转云原生全干货,建议收藏相关的知识,希望对你有一定的参考价值。

01 引子

起因也是因为最近刚好重做了系统,把win10从home版升级到了专业版,可以愉快的安装docker destop 而不需要借助 docker toolbox了。 这个使用体验的提升真的是很不错。无论是配置,还是运行容器的可视化,还是一些辅助工具,真的友好了很多,降低了使用门槛。

02 Kubernetes

k8s 这个名字,起源于古希腊,是舵手的意思,所以它的 logo 即像一张渔网又像一个罗盘,谷歌选择这个名字还有一个深意:既然docker把自己比作一只鲸鱼,驮着集装箱,在大海上遨游,google 就要用Kubernetes去掌握大航海时代的话语权,去捕获和指引着这条鲸鱼按照主人设定的路线去巡游。

K8s将集群中的机器划分为一个Master节点和一群工作节点Node。Master节点上运行着集群管理相关的一组进程kube-apiserver、kube-controller-manager和kube-scheduler。这些进程自动化实现了整个集群的资源管理、Pod调度、弹性伸缩、安全控制、系统监控和纠错等管理功能。

上图可以看到如下组件,使用特别的图标表示Service和Label:

  • Kubernetes Master(Kubernetes主节点)
  • Node(节点)
  • Pod
  • Container(容器)
  • Label(label)(标签)
  • Replication Controller(复制控制器)
  • Service(enter image description here)(服务)

 

Kubernetes Master

Master指的是集群控制节点。每个K8s集群里需要有一个Ms节点负责整个集群的管理和控制。Kubernetes Master提供集群的独特视角,并且拥有一系列组件。

Kubernetes API Server(kube-apiserver),侍卫大统领!提供HTTP Rest接口的关键服务进程,是K8s里所有资源的增删改查等操作的唯一入口,也是集群控制的入口进程。API Server提供可以用来和集群交互的Rest端点。

Kubernetes Controller Master(kube-controller-manager)掌印大太监,大总管!K8s里所有资源对象的自动化控制中心。

Kubernetes Scheduler(kube-scheduler),御马间的调度室!负责资源调度(Pod调度)的进程。创建和复制Pod的Replication Controller

 

Node
节点(上图橘色方框)是物理或者虚拟机器,作为Kubernetes worker,通常称为Minion。每个节点都运行如下Kubernetes关键组件。

(1) Kubelet:与Master节点协作,是主节点的代理,负责Pod对应容器的创建,启动,停止等任务。默认情况下Kubelet会向Master注册自己。Kubelet定期向主机点汇报加入集群的Node的各类信息。
(2) Kube-proxy:Kubernetes Service使用其将链接路由到Pod,作为外部负载均衡器使用,在一定数量的Pod之间均衡流量。比如,对于负载均衡Web流量很有用。
(3) Docker或Rocket:Kubernetes使用的容器技术来创建容器。


Pod
Pod是K8s最重要也是最基础的概念!每个Pod都有一个特殊的被称为“根容器”的Pause容器,此容器与引入业务无关并且不易死亡。且以它的状态代表整个容器组的状态!Pause容器对应的镜像属于K8s平台的一部分,除了Pause容器,每个Pod还包含一个或多个用户业务容器。Pod其实有两种类型:普通的Pod及静态Pod(static Pod),static Pod并不存放在Kubemetes的eted存储里,而是存放在某个具体的Node上的一个具体文件中,并且只在此Node上启动运行。而普通的Pod一旦被创建,就会被放入到etcd中存储,确后会被KubernetesMaster调度到某个具体的Node上并进行绑定(Binding),随后该Pod被对应的Node上的kubelet进程实例化成一组相关的Docker容器并启动起来。在默认情况下,当Pod里的某个容器停止时,Kubemetes会自动检测到这个问题并且重新启动这个Pod(重启Podel)的所有容器),如果Pod所在的Node完机,则会将这个Node上的所有Pod重新调度到其他节点上。Pod(上图绿色方框)安排在节点上,包含一组容器和卷。同一个Pod里的容器共享同一个网络命名空间,可以使用localhost互相通信。

Endpoint(Pod IP + ContainerPort) pod ip:一个Pod里多个容器共享Pod IP地址。K8s要求底层网络支持集群内任意两个Pod之间的TCP/IP直接通信,使用虚拟二层网络技术(Flannel(没有接触过 ),OpenvSwitch)实现。在Vmware中类似的二层交换技术是VSwitch,当然了,现在整个数据中心网络二层逐步从vSwitch—>OpenvSwitch

Lable
Lable类似Docker中的tag,一个是对“特殊”镜像、容器、卷组等各种资源做标记,一个是attach到各种诸如Node、Pod、Server、RC资源对象上。不同的是Lable是一对键值对!Lable类似Tag,可使用K8s专有的标签选择器(Label Selector)进行组合查询。

Replication Controller
Replication Controller,简称RC,她用来干啥呢?就是通过她来实现Pod副本数量的自动控制!RC确保任意时间都有指定数量的Pod“副本”在运行。

如果为某个Pod创建了RC并且指定3个副本,它会创建3个Pod,并且持续监控它们。如果某个Pod不响应,那么Replication Controller会替换它,保持总数为3。如果之前不响应的Pod恢复了,现在就有4个Pod了,那么Replication Controller会将其中一个终止保持总数为3。如果在运行中将副本总数改为5,Replication Controller会立刻启动2个新Pod,保证总数为5。还可以按照这样的方式缩小Pod,这个特性在执行滚动升级时很有用。
注意:删除RC,不会影响该RC已经创建好的Pod。在逻辑上Pod副本和RC是解耦和的!创建RC时,需要指定Pod模板(用来创建Pod副本的模板)和Label(RC需要监控的Pod标签)。
由Replication Controller衍生出Deployment,与RC相似90%,目的是更好地解决Pod编排。暂时不讨论。
Horizontal Pod Autoscaler,简称HPA,Pod横向自动扩容智能控件。与RC,Deployment一样,也属于K8s的一种资源对象。她的实现原理是通过追踪分析RC控制的所有目标Pod的负载变化情况,来确定是否针对性地调整目标Pod的副本数。


Service
微服务架构中的一个“微服务”,她是正真的新娘,而之前的Pod,RC等资源对象其实都是嫁衣。
每个Pod都会被分配一个单独的IP地址,而且每个Pod都提供了一个独立的Endpoint(Pod lP + ContainerPort)以被客户端访问,现在多个Pod副本组成了一个集群来提供服务,客户端要想访问集群,一般的做法是部署一个负载均衡器(软件或硬件),为这组Pod开启一个对外的服务端口如8000端口,并且将这些Pod的Endpoint列表加入8000端口的转发列表中,客户端就可以通过负载均衡器的对外IP地址 + 服务端口来访问此服务,而客户端的请求最后会被转发到哪个Pod,则由负载均衡器的算法所决定。

K8s的server定义了一个服务的访问入口地址,前端(Pod)通过入口地址访问其背后的一组由Pod副本组成的集群实例,service与其后端Pod副本集群之间通过Label Selector 实现“无缝对接”。

 

03 Minikube

minikube相当于一个运行在本地的Kubernetes单节点,我们可以在里面创建Pods来创建对应的服务。

Minikube is a tool that makes it easy to run Kubernetes locally. Minikube runs a single-node Kubernetes cluster inside a VM on your laptop for users looking to try out Kubernetes or develop with it day-to-day

 

04 安装

说的安装,还得奉劝大家提前沐浴更衣,调整好心态。倒不是因为步骤有多难,多复杂,而是因为某些网站因为技术不成熟,你始终访问不到,而焦躁。关于minikube,一些网上人说使用阿里的包,可能福报厂确实拉了分支,改了拉取镜像的地址,但是他们并没有提供编译好的版本,所以使用官方的版本就好。https://github.com/kubernetes/minikube 。 

另外,一定要注意使用release版本(我用1.9.2版),别下测试版,为什么这么提醒?反正我没有因为版本问题,卡了2天,demo都没跑出来。

kubectl 也从官方下载 https://kubernetes.io/docs/tasks/tools/install-kubectl/ 即可。

将两个文件放到一个文件夹下,然后在环境变量里path一下

安装docker 不是主要矛盾,大家自行搜一下,只要确认好环境,再次强调最好升级一下win10,这样操作起来更方便一些,docker toolbox用起来真的不行。

在正式安装之前,还需要设置一个虚拟交换机

接下来,就是安装k8s环境了,记得使用管理员Prowshell

minikube start --image-mirror-country=cn --registry-mirror=https://registry.docker-cn.com  --image-repository=registry.cn-hangzhou.aliyuncs.com/google_containers --hyperv-virtual-switch="minikubaSwitch"

参数说明:

天朝专用参数

--image-mirror-country=cn 

国内docker registry

--registry-mirror=https://registry.docker-cn.com

 

国内镜像源

--image-repository=registry.cn-hangzhou.aliyuncs.com/google_containers

外部交换机

--hyperv-virtual-switch="minikubaSwitch"

 

接下来就是漫长的等待,安装成功后,会多出一个minikube的虚拟机

重点来了啊,如果之前下载失败了,到自己的用户下面把这个.minikube文件夹删除了,重新来一边,如果还是不行,继续删了重来,不要问为什么,问就是上网需要科学。

 

接下来就需要部署 deployment

PS E:\\devlop\\envs\\k8s\\test1> kubectl create -f 1.yml

deployment.apps/datalookerserver created

使用下面的 yml

apiVersion: apps/v1

kind: Deployment

metadata:

  name: datalookerserver

spec:

  selector:

    matchLabels:

      app: datalookerserver

  replicas: 2

  template:

    metadata:

      labels:

        app: datalookerserver

    spec:

      containers:

      - name: datalookerserver

        image:  nginx

          # nginx 

          #datalooker-server:1.0-SNAPSHOT

        imagePullPolicy: Always 

        ports: 

        - containerPort: 80

这里注意image属性,还是使用公网的image,这样比较容易通过,使用本地registry可能因为链路访问问题,导致失败,具体情况,可以异步到参考链接【2】,里面对这个问题有一个比较清楚的阐释。

接下来,可以使用 kubectl get Pods -o wide 查看pod状态

使用, kubectl describe pod datalookerserver-56dbc49bc8-6sdms可以查看具体pod的具体信息

接下来使用相同的指令,创建service

PS E:\\devlop\\envs\\k8s\\test1> kubectl create -f 2.yml

service/datalookerserver created

yml如下:

apiVersion: v1

kind: Service

metadata:

  name: datalookerserver

spec:

  ports:

  - port: 9999 # 服务端口

    protocol: TCP

    targetPort: 80 # 容器端口

  selector:

    app: datalookerserver # 标签选择器,这里的app=web正是我们刚才建立app

使用 minikube dashboard 命令,可以打开网页来对单机集群进行监控

现在,一个整体的简单应用构建起来了,那么我们如何访问呢?

还需要将端口映射出来,我们才能访问

kubectl port-forward svc/datalookerserver 9999:9999

测试一下OK了

参考链接:

[1] https://www.jianshu.com/p/f4c2104ba90a

[2] https://hasura.io/blog/sharing-a-local-registry-for-minikube-37c7240d0615/

[3] https://www.javaroad.cn/questions/304667

[4] https://www.jianshu.com/p/7cc5f727c225

[5] https://zhuanlan.zhihu.com/p/88236691
 

以上是关于半小时学会在Win10上部署K8S,玩转云原生全干货,建议收藏的主要内容,如果未能解决你的问题,请参考以下文章

华为云大咖带你玩转云原生基础设施之K8s

华为云大咖带你玩转云原生基础设施之K8s

半小时体验云原生:手把手教你在k8s上部署springboot应用——干货分享,建议收藏

半小时体验云原生:手把手教你在k8s上部署springboot应用——干货分享,建议收藏

课程报名 | 《六周玩转云原生》- 云原生下的DevOps与持续交付

玩转阿里云:从零到一上手玩转云服务器学习报告