kubernetes入门之构建单机集群

1.kubernetes简介

kubernetes简称k8s,它是一个全新的基于容器技术的分布式架构方案,它是谷歌十几年来大规模应用容器技术的经验累积和升华的一个重要成果。若是咱们的系统设计遵循了k8s的设计思想,那么传统系统架构中哪些和业务没有多大关系的底层代码或功能模块,均可以从咱们的实现中消失。咱们没必要费心与负载均衡的选型,没必要考虑引入或本身开发一个复杂的服务治理框架,没必要再头疼于服务监控和故障处理模块的开发,所以系统后期运维难度和运维成本难度大大下降。node

在k8s中,服务(Service)是核心,一个服务对象拥有以下关键特征:python

  • 拥有一个惟一指定的名字
  • 拥有一个虚拟ip
  • 可以提供某种远程服务能力
  • 被映射到了提供这种服务能力的一组应用上

经过使用服务,咱们没必要担忧IP的变更性,由于服务一旦建立就再也不变化,另外咱们没必要关心后台有多少个服务进程,也没必要担忧这些进程因为服务故障而部署到其余机器,后台这些进程都是由相互独立的容器(默认使用的是docker)所支持。k8s所以提供了pod对象来包装这些容器,而pod运行在Node节点上,Node节点能够为一个物理机或者云端机器,虚拟机等。一样在集群管理上,k8s设计了Master节点和一群工做节点Node,而Master节点至关于k8s的首脑,咱们的全部操做都先要发给master,然后经过Master来调配各个节点的工做。linux

k8s具有如下特征:docker

  • 自动包装

根据资源需求和其余约束自动放置容器,同时不会牺牲可用性,混合关键和最大努力的工做负载,以提升资源利用率并节省更多资源。centos

  • 自我修复

从新启动失败的容器,在节点不可用时,替换和从新调度节点上的容器,对用户定义的健康检查不响应的容器会被停止,而且在容器准备好服务以前不会把其向客户端广播。api

  • 横向缩放

使用简单的命令或 UI,或者根据 CPU 的使用状况自动调整应用程序副本数。tomcat

  • 服务发现和负载均衡

不须要修改您的应用程序来使用不熟悉的服务发现机制,Kubernetes 为容器提供了本身的 IP 地址和一组容器的单个 DNS 名称,并能够在它们之间进行负载均衡。安全

  • 自动部署和回滚

Kubernetes 逐渐部署对应用程序或其配置的更改,同时监视应用程序运行情况,以确保它不会同时终止全部实例。 若是出现问题,Kubernetes会为您恢复更改,利用日益增加的部署解决方案的生态系统。bash

  • 密钥 和 配置管理

部署和更新密钥和应用程序配置,不会从新编译您的镜像,不会在堆栈配置中暴露密钥(secrets)。网络

  • 存储编排

自动安装您所选择的存储系统,不管是本地存储,如公有云提供商 GCP 或 AWS, 仍是网络存储系统 NFS, iSCSI, Gluster, Ceph, Cinder, 或 Flocker。

  • 批处理

除了服务以外,Kubernetes还能够管理您的批处理和 CI 工做负载,若是须要,替换出现故障的容器。

二、安装步骤

2.一、环境准备

阿里云centos7.6 64位系统,经过安全组配置开放8080,2379,2378及30000-31000端口。首先咱们运行以下命令:

$ wget http://mirror.centos.org/centos/7/os/x86_64/Packages/python-rhsm-certificates-1.19.10-1.el7_4.x86_64.rpm
    $ rpm2cpio python-rhsm-certificates-1.19.10-1.el7_4.x86_64.rpm | cpio -iv --to-stdout ./etc/rhsm/ca/redhat-uep.pem | tee /etc/rhsm/ca/redhat-uep.pem

运行如上命令为了解决以下问题,该问题最本质的表现为pod一值为ContainerCreating状态

FailedSynError syncing pod, skipping: failed to "StartContainer" for "POD" with ErrImagePull: "image pull failed for registry.access.redhat.com/rhel7/pod-infrastructure:latest, this may be because there are no credentials on this request. details: (open /etc/docker/certs.d/registry.access.redhat.com/redhat-ca.crt: no such file or directory)" 13m 11s 56 {kubelet 127.0.0.1} Warning FailedSync Error syncing pod, skipping: failed to "StartContainer" for "POD" with ImagePullBackOff: "Back-off pulling image "registry.access.redhat.com/rhel7/pod-infrastructure:latest"

Error syncing pod, skipping: failed to "StartContainer" for "POD" with ErrImagePull: "image pull failed for registry.access.redhat.com/rhel7/pod-infrastructure:latest, this may be because there are no credentials on this request. details: (open /etc/docker/certs.d/registry.access.redhat.com/redhat-ca.crt: no such file or directory)"

紧接着须要运行以下命令:

$ iptables -P FORWARD ACCEPT

这样解决了外网访问kube-proxy没法进行有效的转发问题

2.二、 安装

最简单的方式是经过yum来进行安装,命令以下:

$ yum install -y etcd kubernetes

安装好软件后,修改两个配置文件

  • Docker配置文件目录为/etc/sysconfig/docker,在这个文件中作以下修改
# Modify these options if you want to change the way the docker daemon runs
    OPTIONS='--selinux-enabled=false --insecure-registry gcr.io --log-driver=journald --signature-verification=false'
  • Kubernetes apiServer配置文件位置:/etc/kubernetes/apiserver
    • —adminssion_control参数中的ServiceAccount删除
    • 更改以下配置:
    # The address on the local server to listen to.
          KUBE_API_ADDRESS="--insecure-bind-address=0.0.0.0"

更改好后,咱们依次启动以下服务

$ systemctl start docker
    $ systemctl start etcd
    $ systemctl start kube-apiserver
    $ systemctl start kube-controller-manager
    $ systemctl start kube-scheduler
    $ systemctl start kubelet
    $ systemctl start kube-proxy

至此一个单机版的集群就构建完毕

三、快速上手

3.一、建立RC

接下来我构建一个最简单的tomcat应用为例,来带你们体验一下kubernetes的魔力。首先咱们能够在Idea环境里安装一个kubernetes的插件,这个插件可以友好的对配置文件进行提示。首先咱们建立一个tomcat-rc.yaml的配置文件,代码以下:

apiVersion: v1
    kind: ReplicationController
    metadata:
      name: tomcat
    spec:
      replicas: 2
      selector:
        app: tomcat
      template:
        metadata:
          labels:
            app: tomcat
        spec:
          containers:
            - name: tomcat
              image: tomcat
              ports:
                - containerPort: 8080

ReplicationController(简称RC)是k8s的核心概念之一,简单来讲它定义了一个指望的场景,即声明某种Pod的副本数量在任意时刻都符合某个预期的值,因此RC的定义主要包含以下几个部分

  • Pod期待的副本数
  • 用于筛选目标的Label Selector
  • 当Pod的副本数量小于预期值的时候,用于建立新pod的模板

接着咱们运行以下命令来建立RC:

$ kubectl create -f tomcat-rc.yaml

咱们能够经过以下命令来查看状态:

$ kubectl get rc

此时咱们能够看到咱们刚才建立的RC已经在运行了:

NAME      DESIRED   CURRENT   READY     AGE
    tomcat    2         2         2         31s

咱们能够运行:docker ps的命令来看看:

CONTAINER ID        IMAGE                        COMMAND                  CREATED             STATUS              PORTS               NAMES
    960183da4c2b        tomcat                       "catalina.sh run"        2 minutes ago       Up 2 minutes                            k8s_tomcat_tomcat-mt8b5_default_14ff9d6d-2cdd-11e9-bd6b-025000000001_0
    97c563415280        tomcat                       "catalina.sh run"        2 minutes ago       Up 2 minutes                            k8s_tomcat_tomcat-kfmdj_default_14fe9e52-2cdd-11e9-bd6b-025000000001_0

颇有趣的状况咱们能够看到,当咱们建立RC时,k8s会建立对应副本数的docker容器,这也从侧面反映了经过k8s能屏蔽docker相关容器的建立操做,咱们只须要统一按照既定的排版规范就能编写咱们所需的容器

3.二、建立Service

容器建立好了,其实咱们还有一位角色要粉墨登场,有了它的帮助。才叫一个合理的‘微服务’。其实k8s中service是一个很是很是核心的概念,它相似于代理门户,同时它屏蔽了pod与外界访问。咱们来看一下模板示例:

apiVersion: v1
    kind: Service
    metadata:
      name: tomcat
    spec:
      type: NodePort
      ports:
        - port: 8080
          protocol: tcp
          nodePort: 30001
      selector:
        app: tomcat
  • 默认状况下NodePort是外界访问k8s集群的一种方式,nodePort的值是外界访问的端口它会被映射到容器的8080端口上
  • selector.app的做用是将咱们的Service与后台运行的pod相关联

而后运行以下命令建立服务:

$ kubectl create -f tomcat-svc.yaml

建立完毕后咱们能够运行以下命令来查看服务的状况

$ kubectl get svc

运行完毕会获得以下信息:

NAME          CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
    tomcat        10.254.145.222   <nodes>       8080:30001/TCP   9d

紧接着咱们能够运行curl http://localhost:30001便可得到对应的结果

相关文章
相关标签/搜索