1.kubernetes简介

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

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

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

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

k8s具备以下特征:

  • 自动包装

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

  • 自我修复

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

  • 横向缩放

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

  • 服务发现和负载均衡

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

  • 自动部署和回滚

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

  • 密钥 和 配置管理

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

  • 存储编排

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

  • 批处理

除了服务之外,Kubernetes还可以管理您的批处理和 CI 工作负载,如果需要,替换出现故障的容器。

2、安装步骤

2.1、环境准备

阿里云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.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、快速上手

3.1、创建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.2、创建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即可获得对应的结果

kubernetes入门之构建单机集群的更多相关文章

  1. 阿里云构建Kafka单机集群环境

    简介 在一台ECS阿里云服务器上构建Kafa单个集群环境需要如下的几个步骤: 服务器环境 JDK的安装 ZooKeeper的安装 Kafka的安装 1. 服务器环境 CPU: 1核 内存: 2048 ...

  2. RabbitMQ入门教程(十四):RabbitMQ单机集群搭建

    原文:RabbitMQ入门教程(十四):RabbitMQ单机集群搭建 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://b ...

  3. Kubernetes 部署 Nebula 图数据库集群

    Kubernetes 是什么 Kubernetes 是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes 的目标是让部署容器化的应用简单并且高效,Kubernetes 提供了应 ...

  4. ​在Docker中部署GreatSQL并构建MGR集群

    GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. 为了方面社区用户体验GreatSQL,我们同时还提供Docker镜像,本文详细介绍如何在Docker中部署GreatSQL ...

  5. windows+nginx+iis+redis+Task.MainForm构建分布式架构 之 (nginx+iis构建服务集群)

    本次要分享的是利用windows+nginx+iis+redis+Task.MainForm组建分布式架构,由标题就能看出此内容不是一篇分享文章能说完的,所以我打算分几篇分享文章来讲解,一步一步实现分 ...

  6. 使用Docker构建redis集群--最靠谱的版本

    1集群结构说明 集群中有三个主节点,三个从节点,一共六个结点.因此要构建六个redis的docker容器.在宿主机中将这六个独立的redis结点关联成一个redis集群.需要用到官方提供的ruby脚本 ...

  7. kubernetes kubeadm部署高可用集群

    k8s kubeadm部署高可用集群 kubeadm是官方推出的部署工具,旨在降低kubernetes使用门槛与提高集群部署的便捷性. 同时越来越多的官方文档,围绕kubernetes容器化部署为环境 ...

  8. 玩转nodeJS系列:使用原生API实现简单灵活高效的路由功能(支持nodeJs单机集群),nodeJS本就应该这样轻快

    前言: 使用nodeJS原生API实现快速灵活路由,方便与其他库/框架进行整合: 1.原生API,简洁高效的轻度封装,加速路由解析,nodeJS本就应该这样轻快 2.不包含任何第三方库/框架,可以灵活 ...

  9. zookeeper单机集群搭建

    1. 下载zookeeper 参考官方文档下载一节:https://zookeeper.apache.org/doc/current/zookeeperStarted.html#sc_Download ...

随机推荐

  1. 网络文件系统NFS

    NFS介绍 什么是NFS? NFS是Network File System的缩写,即网络文件系统.它的主要功能是通过网络(一般是局域网)让不同的主机系统之间可以共享文件或目录.NFS客户端(一般为应用 ...

  2. 65. Valid Number 判断字符串是不是数字

    [抄题]: Validate if a given string is numeric. Some examples:"0" => true" 0.1 " ...

  3. stark组件开发之编辑功能实现

    编辑功能.和添加一样! 唯一不同的就是, 需要编辑一个指定的  记录.这就需要,在列表页面, 渲染编辑的时候,添加一个 id 值: class UserInfoHandler(StartHandler ...

  4. Linux学习笔记:Tomcat安装与使用

    Tomcat是一个Servlet容器服务器,用java实现的. 目录结构 Tomcat的安装也很简单,从官网下载安装包.解压后的tomcat目录 apache-tomcat-7.0.92 下的子目录为 ...

  5. OpenCV图像分割2

    1.GrubCut算法 2.K-means聚类算法 3.分水岭算法

  6. 走进JDK(七)------LinkedList

    要学习LinkedList,首先得了解链表结构.上篇介绍ArrayList的文章中介绍了底层是数组结构,查询快的问题,但是删除时,需要将删除位置后面的元素全部左移,因此效率比较低. 链表则是这种机制: ...

  7. python模块:json

    r"""JSON (JavaScript Object Notation) <http://json.org> is a subset of JavaScri ...

  8. [Solution] JZOJ3470 最短路

    [Solution] JZOJ3470 最短路 题面 Description 给定一个n个点m条边的有向图,有k个标记点,要求从规定的起点按任意顺序经过所有标记点到达规定的终点,问最短的距离是多少. ...

  9. IntelliJ IDEA的破解方法

    一.下载并安装, IntelliJ IDEA的官网:https://www.jetbrains.com 下载 下载 下载 二.破解. 百度下载一个 JetbrainsCrack-2.7-release ...

  10. MySQL导入SQL语句报错 : MySQL server has gone away (已解决)

    MySQL server has gone away 解决的方法其实很简单,我相信也有很多人遇到了这个问题.比如DZ论坛,安装好服务器,但是清空缓存等操作数据库的动作,运行时间稍长就会出现 MySQL ...