kubernetes(一)搭建简单实例

Kubernates是什么

它是一个全新的基于容器技术的分布式架构领先方案。这个方案虽然还很新,但是它是谷歌十几年依赖大规模应用容器技术的经验积累和升华的一个重要成果。实现资源管理的自动化,以及跨多个数据中心的资源利用率的最大化

其次,如果我们的系统设计遵循了Kubernetes的设计思想,那么传统系统架构中那些和业务没有多大关系的底层代码或功能模块,都可以立刻从我们的视线消失,我们不必再费心于负载均衡器和部署实施问题,不必再考虑引用或自己开发一个复杂的服务治理框架,不必再头疼于服务监控和故障处理模块的开发。使用Kubernets提供的解决方案,我们仅节省了不少于30%的开发成本,同时可以将精力更加集中于业务本身,而且由于Kubernetes提供了强大的自动化机制,所以系统后期的运维难度和运维成本大幅度降低。

Kubernetes是一个开发的开发平台。没有限定任何编程接口,所以不论是Java、Go、C++还是用Python编写的服务,都可以毫无困难地映射为Kubernetes的Service,并通过标准的TCP通信协议进行交互。此外,由于Kubernetes平台对现有的编程语言、编程框架、中间价没有任何侵入性,因此现有的系统很容器改造升级并迁移到Kubernetes平台上

Kubernetes是一个完备的分布式系统支撑平台,Kubernetes具有完备的集群管理能力,包括多层次的安全防护和准入机制、多租户应用支撑能力、透明的服务注册和服务发现机制、内建智能负载均衡器、强大的故障发现和自我修复能力、服务滚动升级和在线扩容能力、可扩展的资源自动调度机制,以及多粒度的资源配额管理能力。同时,Kubernetes提供了完善的管理工具,这些工具涵盖了包括开发、部署测试、运维监控在内的各个环节。因此Kubernetes是一个全新的基于容器技术的分布式架构解决方案,并且是一个一站式的完备的分布式系统开发和支撑平台

为什么要用kubernetes

我们可以"轻装上阵"地开发复杂系统了。在采用Kubernetes解决方案之后,只需要一个精悍的小团队就能轻松应对。在这个团队里,一名架构师专注于系统"服务组件"的提炼,几名开发工程师专注于业务代码的开发,一名系统兼运维工程师负责Kubernetes的部署和运维,从此再也不用"996",这并不是因为我们少做了什么,而是因为Kubernetes已经帮我们做了很多。

使用Kubernetes就是在全面拥抱微服务架构。微服务架构的核心是将一个巨大的单体应用分解为很多小的互相连接的微服务,一个微服务背后可能有多个实例副本在支撑,副本的数量可能会虽社系统的负荷变化而进行调整,内嵌的负载均衡器在这里发挥了重要作用。微服务架构使得每个服务都可以由专门的开发团队开发,开发者可以自由选择开发技术,这对于大规模团队来说很有价值,另外每个微服务独立开发、升级、扩展,因此系统具备很高的稳定性和快速迭代进化能力。谷歌、亚马逊、eBay,等国内大厂也都采用了微服务架构,此次谷歌更是将微服务架构的基础设施直接打包到Kubernetes解决方案中,让我们有机会直接应用微服务架构解决复杂业务的架构问题。

Kubernetes系统架构具备了超强的横向扩容能力。对于互联网公司来说,用户规模就等价于资产,谁拥有更多的用户,就能在竞争中胜出。因此超强的横向扩容能力是互联网业务系统的关键指标之一。不用修改代码,一个Kubernetes集群即可从只包含几个Node的小集群平滑扩展到上百个Node的大规模集群,我们利用Kubernetes提供的工具,甚至可以在线完成集群扩容。只要我们的微服务设计得好,结合硬件或公有云资源的线性增加,系统就能够承受大量用户并发访问带来的的巨大压力

简单实例

安装minikube

brew install minikube
复制代码

image.png

启动minikube

minikube start
复制代码

image.png 原因:docker没有启动,启动docker后,启动成功

image.png 而且多了一个docker

image.png

查看kuber运行状态

kubectl cluster-info
复制代码

image.png

通过ssh连接到这个节点

minikube ssh
复制代码

image.png

创建mysql

创建好 mysql-rc.yaml文件后,为了将它发布到kubernetes集群中,我们在Master节点执行命令:

kubectl create -f mysql-rc.yaml
复制代码

image.png

Kubernetes 通过template来生成pod,创建完后模板和pod就没有任何关系了,rc通过 labels来找对应的pod,控制副本。接下来,我们用kubectl命令查看刚刚创建的RC:

kubectl get rc
复制代码

image.png

然后,我们创建一个与之关联的 Kubernetes Service——MySQL的定义文件 mysql-svc.yaml

apiVersion: v1
kind: Service
metadata:
  name: mysql
spec:
  ports:
  - port: 3306
  selector:
    app: mysqls
复制代码

运行 kubectl命令,创建service:

kubectl create -f mysql-svc.yaml 
复制代码

image.png 运行 kubectl 命令,可以查看到刚刚创建的service:

kubectl get svc
复制代码

image.png 注意到MySQL服务被分配了一个值为10.102.12.112的Cluster IP地址,这是一个虚地址,随后,Kubernetes集群中其他新创建的Pod就可以通过Service的Cluster IP+ 端口号3306来连接和访问它了。

在通常情况下,Cluster IP 是在Service创建后,由Kubernetes 系统自动分配的,其他Pod无法预先知道某个Service的Cluster IP地址,因此需要一个服务发现机制来知道这个服务。为此,最初时,Kubernetes巧妙地使用率Linux环境变量来解决这个问题。现在我们只需要知道,根据Service的唯一名字,容器可以从环境变量中获取到Service对应的Cluster IP 地址和端口,从而发起 TCP/IP 连接请求了。

启动tomcat应用

上面我们定义和启动了Mysql服务,接下来我们采用同样的步骤,完成Tomcat应用的启动过程。首先,创建对应的 RC 文件 myweb-rc.yaml,内容如下:

apiVersion: v1
kind: ReplicationController
metadata:
  name: myweb
spec:
  replicas: 2
  selector:
    app: myweb
  template:
    metadata:
      labels:
        app: myweb
    spec:
      containers:
      - name: myweb
        image: kubeguide/tomcat-app:v1
        ports:
        - containerPort: 8080
        env:
        - name: MYSQL_SERVICE_HOST
          value: "mysql"
        - name: MYSQL_SERVICE_PORT
          value: "3306"
复制代码

注意,Tomcat容器内,应用将使用环境变量 MYSQL_SERVICE_HOST 的值连接MySQL服务。更安全可靠的用法是使用服务的名称 "mysql", 运行下面的命令,完成RC的创建和验证工作。

kubectl create -f myweb-rc.yaml 
复制代码

image.png 最后,创建对应的Service:。以下是完整的yaml定义文件:

apiVersion: v1
kind: Service
metadata: 
  name: myweb
spec:
  type: NodePort
  ports:
    - port: 8080
      nodePort: 30001
  selector:
    app: myweb
复制代码

type=NodePort 和 nodePort=30001 的两个属性,表示此 Service开启了 NodePort方式的外网访问模式,在Kubernetes集群之外,比如在本机的浏览器里,可以通过 30001 这个端口访问myweb(对应 8080 的虚端口上)。

运行 kubectl create 命令进行创建:

kubectl create -f myweb-svc.yaml 
复制代码

image.png

运行kubectl get svc

image.png 运行kubectl get rc

image.png

至此,我们的第1个Kubernetes 例子搭建完成了,通过浏览器访问网页

http://localhost:30001/
复制代码

image.png

参考

[1]Kubernetes入门
[2]mac安装启动minikube

猜你喜欢

转载自juejin.im/post/7084926299340275743