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. APIcloud微信支付和支付宝支付(方案2,主要在后台进行)

    支付宝代码 var aliPay = api.require('aliPay'); api.ajax({ url: yuming+'index.php/api/Alipay/getOrder', me ...

  2. Mac Eclipse 配置 SDK Manager Proxy (代理)

    默认的下载地址非常慢,可以换成东软的代理. 顶部任务栏中选择SDK Manager -> 偏好设置 : 可以看到下载速度快了很多,出现类很多安装选项: 安装好后,在偏好设置窗口中,选择Clear ...

  3. JAVA初学者的JDB 尝试

    使用JDB调试简单递归程序 跟着娄老师的博客学习, 首先在终端使用Ctrl+Shift+T打开三个标签,方便操作. 使用Vim编辑自己的程序,练习程序如下 1 public class Factori ...

  4. Quartz.NET快速入门指南

    最近,在工作中遇到了 Quartz.net 这个组件,为了更好的理解项目代码的来龙去脉,于是决定好好的研究一下这个东西.确实是好东西,既然是好东西,我就拿出来分享一下.万丈高楼平地起,我们也从入门开始 ...

  5. 描述符__get__,__set__,__delete__

    描述符__get__,__set__,__delete__ # 描述符:1用来代理另外一个类的属性 # __get__():调用一个属性时,触发 # __set__():为一个属性赋值时触发 # __ ...

  6. 【转】《深入理解C# 3.x的新特性》博文系列汇总

    [转]<深入理解C# 3.x的新特性>博文系列汇总 较之C# 2.0, C# 3.x引入了一系列新的特性,为我们编程带来很大的便利,通过有效地利用这些新特性,我们可以编写出更加简洁.优雅的 ...

  7. jQuery基础语法

    一.选择器(同css) 1.基本选择器 $("div") 通过标签名获取标签 $("#id") 通过id获取标签 $(".class") 通 ...

  8. Spring 的配置详解

    Bean元素 Spring创建对象的方式 (1)空参构造方式 (2)静态工厂(了解) (3)实例工厂方式 Bean元素进阶 (1)scope属性 a.singleton (2)生命周期属性 Sprin ...

  9. channel和Stream的对比

    这篇文章主要想总结下NIO的channel的传统io中的stream的差别在哪.网上找了很多文章,都感觉只是说了概念.然后自己大概看了下源码,结合概念,整理一下.有些地方可能不是很准确,也希望可以给点 ...

  10. ETL概念详解

    ETL是将业务系统的数据经过抽取.清洗转换之后加载到数据仓库的过程,目的是将企业中的分散.零乱.标准不统一的数据整合到一起,为企业的决策提供分析依据. ETL是BI项目重要的一个环节. 通常情况下,在 ...