kubernetes的简介及使用教程(转)

前言:

  总结docker的时候,曾提到swarm和kubernetes,而kubbernetes在技术市场的应用上要比swarm好很多,今天准备总结下kubernetes的简介和用法,恰好发现了<惨绿少年>博主的这篇文章,(感谢!)总结的非常好,既有简介又有用例,就直接转了,嘿嘿。原文地址附在文末。

  PS:之前学习cobbler时似乎就看过他的博客,写的的确很不错,是个优秀的前辈。

1.1 Kubernetes简介

1.1.1 什么是Kubernetes

Kubernetes (通常称为K8s,K8s是将8个字母“ubernete”替换为“8”的缩写) 是用于自动部署、扩展和管理容器化(containerized)应用程序的开源系统。Google设计并捐赠给Cloud Native Computing Foundation(今属Linux基金会)来使用的。

它旨在提供“跨主机集群的自动部署、扩展以及运行应用程序容器的平台”。它支持一系列容器工具, 包括Docker等。CNCF于2017年宣布首批Kubernetes认证服务提供商(KCSPs),包含IBM、MIRANTIS、华为、inwinSTACK迎栈科技等服务商。

1.1.2 Kubernetes发展史

Kubernetes (希腊语"舵手" 或 "飞行员") 由Joe Beda,Brendan Burns和Craig McLuckie创立,并由其他谷歌工程师,包括Brian Grant和Tim Hockin进行加盟创作,并由谷歌在2014年首次对外宣布 。它的开发和设计都深受谷歌的Borg系统的影响,它的许多顶级贡献者之前也是Borg系统的开发者。在谷歌内部,Kubernetes的原始代号曾经是Seven,即星际迷航中友好的Borg(博格人)角色。Kubernetes标识中舵轮有七个轮辐就是对该项目代号的致意。

Kubernetes v1.0于2015年7月21日发布。随着v1.0版本发布,谷歌与Linux 基金会合作组建了Cloud Native Computing Foundation (CNCF)并把Kubernetes作为种子技术来提供。

Rancher Labs在其Rancher容器管理平台中包含了Kubernetes的发布版。Kubernetes也在很多其他公司的产品中被使用,比如Red Hat在OpenShift产品中,CoreOS的Tectonic产品中, 以及IBM的IBM云私有产品中。

1.1.3 Kubernetes 特点

1、可移植: 支持公有云,私有云,混合云,多重云(multi-cloud)

2、可扩展: 模块化, 插件化, 可挂载, 可组合

3、自动化: 自动部署,自动重启,自动复制,自动伸缩/扩展

4、快速部署应用,快速扩展应用

5、无缝对接新的应用功能

6、节省资源,优化硬件资源的使用

1.1.4 Kubernetes规划组件

参考文档:http://docs.kubernetes.org.cn/249.html

Kubernetes定义了一组构建块,它们可以共同提供部署、维护和扩展应用程序的机制。组成Kubernetes的组件设计为松耦合和可扩展的,这样可以满足多种不同的工作负载。可扩展性在很大程度上由Kubernetes API提供——它被作为扩展的内部组件以及Kubernetes上运行的容器等使用。

Pod

Kubernetes的基本调度单元称为“pod”。它可以把更高级别的抽象内容增加到容器化组件。一个pod一般包含一个或多个容器,这样可以保证它们一直位于主机上,并且可以共享资源。Kubernetes中的每个pod都被分配一个唯一的(在集群内的)IP地址这样就可以允许应用程序使用端口,而不会有冲突的风险。

Pod可以定义一个卷,例如本地磁盘目录或网络磁盘,并将其暴露在pod中的一个容器之中。pod可以通过Kubernetes API手动管理,也可以委托给控制器来管理。

标签和选择器

Kubernetes使客户端(用户或内部组件)将称为“标签”的键值对附加到系统中的任何API对象,如pod和节点。相应地,“标签选择器”是针对匹配对象的标签的查询。

标签和选择器是Kubernetes中的主要分组机制,用于确定操作适用的组件。

例如,如果应用程序的Pods具有系统的标签 tier ("front-end", "back-end", for example) 和一个 release_track ("canary", "production", for example),那么对所有"back-end" 和 "canary" 节点的操作可以使用如下所示的标签选择器:

tier=back-end AND release_track=canary

控制器

控制器是将实际集群状态转移到所需集群状态的对帐循环。它通过管理一组pod来实现。一种控制器是一个“复制控制器”,它通过在集群中运行指定数量的pod副本来处理复制和缩放。如果基础节点出现故障,它还可以处理创建替换pod。

其它控制器,是核心Kubernetes系统的一部分包括一个“DaemonSet控制器”为每一台机器(或机器的一些子集)上运行的恰好一个pod,和一个“作业控制器”用于运行pod运行到完成,例如作为批处理作业的一部分。控制器管理的一组pod由作为控制器定义的一部分的标签选择器确定。

服务

Kubernetes服务是一组协同工作的pod,就像多层架构应用中的一层。构成服务的pod组通过标签选择器来定义。

Kubernetes通过给服务分配静态IP地址和域名来提供服务发现机制,并且以轮询调度的方式将流量负载均衡到能与选择器匹配的pod的IP地址的网络连接上(即使是故障导致pod从一台机器移动到另一台机器)。默认情况下,一个服务会暴露在集群中(例如,多个后端pod可能被分组成一个服务,前端pod的请求在它们之间负载平衡);但是,一个服务也可以暴露在集群外部(例如,从客户端访问前端pod)。

1.1.5 Kubernetes核心组件

Kubernetes遵循master-slave architecture。Kubernetes的组件可以分为管理单个的 node 组件和控制平面的一部分的组件。

Kubernetes Master是集群的主要控制单元,用于管理其工作负载并指导整个系统的通信。Kubernetes控制平面由各自的进程组成,每个组件都可以在单个主节点上运行,也可以在支持high-availability clusters的多个主节点上运行。

Kubernetes主要由以下几个核心组件组成:


组件名称


说明


etcd


保存了整个集群的状态;


apiserver


提供了资源操作的唯一入口,并提供认证、授权、访问控制、API注册和发现等机制;


controller manager


负责维护集群的状态,比如故障检测、自动扩展、滚动更新等;


scheduler


负责资源的调度,按照预定的调度策略将Pod调度到相应的机器上;


kubelet


负责维护容器的生命周期,同时也负责Volume(CVI)和网络(CNI)的管理;


Container runtime


负责镜像管理以及Pod和容器的真正运行(CRI);


kube-proxy


负责为Service提供cluster内部的服务发现和负载均衡;

核心组件结构图

除了核心组件,还有一些推荐的Add-ons:


组件名称


说明


kube-dns


负责为整个集群提供DNS服务


Ingress Controller


为服务提供外网入口


Heapster


提供资源监控


Dashboard


提供GUI


Federation


提供跨可用区的集群


Fluentd-elasticsearch


提供集群日志采集、存储与查询

1.1.6 分层架构

Kubernetes设计理念和功能其实就是一个类似Linux的分层架构,如下图所示:

分层说明:


分层结构


说明


核心层


Kubernetes最核心的功能,对外提供API构建高层的应用,对内提供插件式应用执行环境


应用层


部署(无状态应用、有状态应用、批处理任务、集群应用等)和路由(服务发现、DNS解析等)


管理层


系统度量(如基础设施、容器和网络的度量),自动化(如自动扩展、动态Provision等)以及策略管理(RBAC、Quota、PSP、NetworkPolicy等)


接口层


kubectl命令行工具、客户端SDK以及集群联邦


生态系统


在接口层之上的庞大容器集群管理调度的生态系统,可以划分为两个范畴


Kubernetes外部


日志、监控、配置管理、CI、CD、Workflow、FaaS、OTS应用、ChatOps等


Kubernetes内部


CRI、CNI、CVI、镜像仓库、Cloud Provider、集群自身的配置和管理等

1.2 部署Kubernetes集群

1.2.1 主机环境说明

系统版本说明

[[email protected] ~]# cat /etc/redhat-release
CentOS Linux release 7.2.1511 (Core)
[[email protected]-master ~]# uname -r
3.10.0-327.el7.x86_64
[[email protected]-master ~]# getenforce
Disabled
[[email protected]-master ~]# systemctl status  firewalld.service
● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
   Active: inactive (dead)

主机IP规划


主机名


IP


功能


k8s-master


10.0.0.11/172.16.1.11


Master、etcd、registry


k8s-node-1


10.0.0.12/172.16.1.12


node1


k8s-node-2


10.0.0.13/172.16.1.13


node2

设置hosts解析

[[email protected] ~]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
10.0.0.11   k8s-master
10.0.0.12   k8s-node-1
10.0.0.13   k8s-node-2

1.2.2 安装软件包

在三个节点上分别操作

[[email protected] ~]# yum install etcd docker kubernetes flannel  -y
[[email protected] ~]# yum install docker kubernetes flannel  -y
[[email protected] ~]# yum install docker kubernetes flannel  -y

安装的软件版本说明

[[email protected] ~]# rpm -qa  etcd docker kubernetes flannel
flannel-0.7.1-2.el7.x86_64
docker-1.12.6-71.git3e8e77d.el7.centos.1.x86_64
kubernetes-1.5.2-0.7.git269f928.el7.x86_64
etcd-3.2.11-1.el7.x86_64

1.2.3 修改配置etcd

yum安装的etcd默认配置文件在/etc/etcd/etcd.conf。

最终配置文件

[[email protected] ~]# grep -Ev ‘^$|#‘ /etc/etcd/etcd.conf
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379"
ETCD_NAME="default"
ETCD_ADVERTISE_CLIENT_URLS="http://10.0.0.11:2379"

启动etcd

[[email protected] ~]# systemctl enable etcd
[[email protected] ~]# systemctl start etcd

测试etcd

etcdctl set testdir/testkey0 0
etcdctl set testdir/testkey0 0
[[email protected]-master ~]# etcdctl -C http://10.0.0.11:2379 cluster-health
member 8e9e05c52164694d is healthy: got healthy result from http://10.0.0.11:2379
cluster is healthy

1.2.4 配置并启动kubernetes

/etc/kubernetes/apiserver配置文件内容

[[email protected] ~]#  grep -Ev ‘^$|#‘  /etc/kubernetes/apiserver
KUBE_API_ADDRESS="--insecure-bind-address=0.0.0.0"
KUBE_API_PORT="--port=8080"
KUBE_ETCD_SERVERS="--etcd-servers=http://10.0.0.11:2379"
KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=10.254.0.0/16"
KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ResourceQuota"
KUBE_API_ARGS=""

/etc/kubernetes/config配置文件

[[email protected] ~]#  grep -Ev ‘^$|#‘ /etc/kubernetes/config
KUBE_LOGTOSTDERR="--logtostderr=true"
KUBE_LOG_LEVEL="--v=0"
KUBE_ALLOW_PRIV="--allow-privileged=false"
KUBE_MASTER="--master=http://10.0.0.11:8080"

启动服务

systemctl enable kube-apiserver.service
systemctl start kube-apiserver.service
systemctl enable kube-controller-manager.service
systemctl start kube-controller-manager.service
systemctl enable kube-scheduler.service
systemctl start kube-scheduler.service

1.2.5 部署配置node

/etc/kubernetes/config配置文件

[[email protected] ~]# grep -Ev ‘^$|#‘  /etc/kubernetes/config
KUBE_LOGTOSTDERR="--logtostderr=true"
KUBE_LOG_LEVEL="--v=0"
KUBE_ALLOW_PRIV="--allow-privileged=false"
KUBE_MASTER="--master=http://10.0.0.11:8080"
[[email protected]-node-1 ~]# grep -Ev ‘^$|#‘  /etc/kubernetes/kubelet
KUBELET_ADDRESS="--address=0.0.0.0"
KUBELET_HOSTNAME="--hostname-override=10.0.0.12"
KUBELET_API_SERVER="--api-servers=http://10.0.0.11:8080"
KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=registry.access.redhat.com/rhel7/pod-infrastructure:latest"
KUBELET_ARGS=""

/etc/kubernetes/config配置文件

[[email protected] ~]# grep -Ev ‘^$|#‘  /etc/kubernetes/config
KUBE_LOGTOSTDERR="--logtostderr=true"
KUBE_LOG_LEVEL="--v=0"
KUBE_ALLOW_PRIV="--allow-privileged=false"
KUBE_MASTER="--master=http://10.0.0.11:8080"
[[email protected]-node-2 ~]# grep -Ev ‘^$|#‘  /etc/kubernetes/kubelet
KUBELET_ADDRESS="--address=0.0.0.0"
KUBELET_HOSTNAME="--hostname-override=10.0.0.13"
KUBELET_API_SERVER="--api-servers=http://10.0.0.11:8080"
KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=registry.access.redhat.com/rhel7/pod-infrastructure:latest"
KUBELET_ARGS=""

启动

systemctl enable kubelet.service
systemctl start kubelet.service
systemctl enable kube-proxy.service
systemctl start kube-proxy.service

在master上查看集群中节点及节点状态

# kubectl -s http://10.0.0.11:8080 get node
[[email protected] ~]# kubectl -s http://10.0.0.11:8080 get node
NAME        STATUS    AGE
10.0.0.12   Ready     49s
10.0.0.13   Ready     56s
[[email protected]-master ~]# kubectl get nodes
NAME        STATUS    AGE
10.0.0.12   Ready     1m
10.0.0.13   Ready     1m

至此Kubernetes基础部署完成

1.2.6 Kubernetes其他安装方法

二进制安装

kubuadm 安装

minikube 安装

ansible部署:https://github.com/gjmzj/kubeasz

1.3 创建覆盖网络--Flannel

1.3.1 配置Flannel(所有节点操作)

安装软件包

yum install flannel -y

修改配置文件

[[email protected] ~]# grep "^[a-Z]" /etc/sysconfig/flanneld
FLANNEL_ETCD_ENDPOINTS="http://10.0.0.11:2379"
FLANNEL_ETCD_PREFIX="/atomic.io/network"

1.3.2 配置etcd中关于flannel的key

Flannel使用Etcd进行配置,来保证多个Flannel实例之间的配置一致性,所以需要在etcd上进行如下配置:(‘/atomic.io/network/config’这个key与上文/etc/sysconfig/flannel中的配置项FLANNEL_ETCD_PREFIX是相对应的,错误的话启动就会出错)

配置网络范围

etcdctl mk  /atomic.io/network/config ‘{ "Network": "172.16.0.0/16" }‘

操作创建网络

[[email protected] ~]# etcdctl mk /atomic.io/network/config ‘{ "Network": "172.16.0.0/16" }‘
{ "Network": "172.16.0.0/16" }

master节点操作

    systemctl enable flanneld.service
    systemctl start flanneld.service
    service docker restart
    systemctl restart kube-apiserver.service
    systemctl restart kube-controller-manager.service
    systemctl restart kube-scheduler.service

node节点操作

    systemctl enable flanneld.service
    systemctl start flanneld.service
    service docker restart
    systemctl restart kubelet.service
    systemctl restart kube-proxy.service
    

修改配置文件

[[email protected] ~]# cat  /etc/kubernetes/apiserver
KUBE_API_ADDRESS="--insecure-bind-address=0.0.0.0"
KUBE_API_PORT="--port=8080"
KUBE_ETCD_SERVERS="--etcd-servers=http://10.0.0.11:2379"
KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=10.254.0.0/16"
KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ResourceQuota"
KUBE_API_ARGS=""

至此Flannel网络配置完成

1.4 创建一个简单的pod

Pod是K8s集群中所有业务类型的基础

Pod是在K8s集群中运行部署应用或服务的最小单元,它是可以支持多容器的。

Pod的设计理念是支持多个容器在一个Pod中共享网络地址和文件系统。

POD控制器Deployment、Job、DaemonSet和PetSet

1.4.1 写一个编排yaml格式

kubenetes里面的创建service、rc、pod都是这种形式(另外一种是json)

关于yaml参考:http://t.cn/RK0Jlwu

[[email protected] ~]# cat  /etc/kubernetes/apiserver
KUBE_API_ADDRESS="--insecure-bind-address=0.0.0.0"
KUBE_API_PORT="--port=8080"
KUBE_ETCD_SERVERS="--etcd-servers=http://10.0.0.11:2379"
KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=10.254.0.0/16"
KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ResourceQuota"
KUBE_API_ARGS=""

1.4.2 启动一个pod

[[email protected] ~]# kubectl create -f hello.yaml
pod "hello-world" created

查看默认namespace下的pods

[[email protected] ~]# kubectl get pods
NAME          READY     STATUS              RESTARTS   AGE
hello-world   0/1       ContainerCreating   0          8s

查看pod的详细信息

[[email protected] ~]# kubectl  describe pod  hello-world
Events:
  FirstSeen    LastSeen    Count    From            SubObjectPath    Type       Reason        Message
  ---------    --------    -----    ----            -------------    --------   ------        -------
  4m        4m        1    {default-scheduler}      Normal         Scheduled    Successfully assigned hello-world to 10.0.0.13
  4m        1m        5    {kubelet 10.0.0.13}      Warning        FailedSync    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)"
  3m        14s       13   {kubelet 10.0.0.13}      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\""

该错误的解决方法: yum install python-rhsm* -y

获取指定pods详细信息

kubectl describe pods yourpodname

获取已运行pod状态

kubectl get pods -o wide

下载pod-infrastructure镜像包

docker tag docker.io/tianyebj/pod-infrastructure:latest registry.access.redhat.com/rhel7/pod-infrastructure:lates

1.4.3 pod其他操作

删除pod,重新创建

[[email protected] ~]# kubectl delete -f hello.yaml
pod "hello-world" deleted
[[email protected]-master ~]# kubectl create -f hello.yaml
pod "hello-world" created

查看状态

[[email protected] ~]# kubectl get pods -o wide
NAME        READY     STATUS             RESTARTS   AGE       IP            NODE
nginx-web   1/1       ImagePullBackOff   0          1m        172.16.53.2   10.0.0.13

1.5 Replication Controller

RC是K8s集群中最早的保证Pod高可用的API对象。通过监控运行中的Pod来保证集群中运行指定数目的Pod副本。指定的数目可以是多个也可以是1个;少于指定数目,RC就会启动运行新的Pod副本;多于指定数目,RC就会杀死多余的Pod副本。

即使在指定数目为1的情况下,通过RC运行Pod也比直接运行Pod更明智,因为RC也可以发挥它高可用的能力,保证永远有1个Pod在运行。

1.5.1 简单rc配置

[[email protected] ~]# kubectl get  rc

始终保证有一个在活着

更新rc文件

[[email protected] ~]# kubectl replace -f  nginx.yml

nginx.yml文件信息

[[email protected] ~]# vim nginx.yml
apiVersion: v1
kind: Pod
metadata:
  name: nginx-2
spec:
  restartPolicy: Never
  containers:
  - name: nginx
    image: "docker.io/nginx:latest"

对现有已创建资源直进行修改

[[email protected] ~]# kubectl edit rc nginx

可以调整数量即使生效

1.5.2 rs实现灰度发布

RS是新一代RC,提供同样的高可用能力,区别主要在于RS后来居上,能支持更多中的匹配模式。副本集对象一般不单独使用,而是作为部署的理想状态参数使用。

是K8S 1.2中出现的概念,是RC的升级。一般和Deployment共同使用。

部署表示用户对K8s集群的一次更新操作。部署是一个比RS应用模式更广的API对象,可以是创建一个新的服务,更新一个新的服务,也可以是滚动升级一个服务。滚动升级一个服务,实际是创建一个新的RS,然后逐渐将新RS中副本数增加到理想状态,将旧RS中的副本数减小到0的复合操作;

  这样一个复合操作用一个RS是不太好描述的,所以用一个更通用的Deployment来描述。

  以K8s的发展方向,未来对所有长期伺服型的的业务的管理,都会通过Deployment来管理。

  Deployment是对RC的升级,与RC的相似度超过90%。

web-rc.yaml文件内容

[[email protected] ~]# cat web-rc.yaml
apiVersion: v1
kind: ReplicationController
metadata:
  name: myweb
spec:
  replicas: 3
  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‘

创建集群

[[email protected] ~]# kubectl create -f web-rc.yaml

对集群进行升级操作

   将集群内容器自动升级到新版本的容器

[[email protected] ~]# kubectl rolling-update  myweb  -f web-rc2.yaml 

web-rc2.yaml配置文件内容

[[email protected] ~]# cat web-rc2.yaml
apiVersion: v1
kind: ReplicationController
metadata:
  name: myweb-2
spec:
  replicas: 3
  selector:
    app: myweb-2
  template:
    metadata:
      labels:
        app: myweb-2
    spec:
      containers:
      - name: myweb-2
        image: kubeguide/tomcat-app:v2
        ports:
        - containerPort: 8080
        env:
        - name: MYSQL_SERVICE_HOST
          value: ‘mysql‘
        - name: MYSQL_SERVICE_PORT
          value: ‘3306‘

升级后的回滚

   使用新的文件,进行升级操作可达到回滚的目的,参考:https://github.com/kubeguide/samplecode

[[email protected] ~]# kubectl rolling-update  myweb-2  -f web-rc.yaml 

1.5.3 rc小结

?? RC里包括完整的POD定义模板

?? RC通过Label Selector机制实现对POD副本的自动控制。

?? 通过改变RC里的POD副本以实现POD的扩容和缩容

?? 通过改变RC里POD模块中的镜像版本,可以实现POD的滚动升级。

1.6 服务(Service)

1.6.1 Service作用

RC、RS和Deployment只是保证了支撑服务的POD的数量,但是没有解决如何访问这些服务的问题。一个Pod只是一个运行服务的实例,随时可能在一个节点上停止,在另一个节点以一个新的IP启动一个新的Pod,因此不能以确定的IP和端口号提供服务。

要稳定地提供服务需要服务发现和负载均衡能力。服务发现完成的工作,是针对客户端访问的服务,找到对应的的后端服务实例。

在K8集群中,客户端需要访问的服务就是Service对象。每个Service会对应一个集群内部有效的虚拟IP,集群内部通过虚拟IP访问一个服务。

在K8s集群中微服务的负载均衡是由Kube-proxy实现的。Kube-proxy是K8s集群内部的负载均衡器。它是一个分布式代理服务器,在K8s的每个节点上都有一个;这一设计体现了它的伸缩性优势,需要访问服务的节点越多,提供负载均衡能力的Kube-proxy就越多,高可用节点也随之增多。

1.6.2 测试service

[[email protected] ~]# vim myweb-svc.yaml
apiVersion: v1
kind: Service
metadata:
  name: myweb
spec:
  type: NodePort
  ports:
    - port: 8080
      nodePort: 30001
  selector:
    app: myweb

启动集群

[[email protected] ~]# kubectl create -f myweb-svc.yaml
service "myweb" created
[[email protected]-master ~]# kubectl get svc
NAME         CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
kubernetes   10.254.0.1      <none>        443/TCP          6h
myweb        10.254.247.21   <nodes>       8080:30001/TCP   12s

浏览器访问测试

1.6.3 service原理图

网访问node ip 转到cluster ip上 在进行pod 分发  rr轮询

kubectl create -f web-svc.yaml
    [[email protected]-master ~]# kubectl get service

    NAME         CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
    kubernetes   10.254.0.1      <none>        443/TCP          4h
    myweb        10.254.168.71   <nodes>       8080:30001/TCP   15s

1.6.4 K8S三种IP


类型


说明


Node IP


节点设备的IP,如物理机,虚拟机等容器宿主的实际IP。


Pod IP


Pod 的IP地址,是根据docker0网格IP段进行分配的。


Cluster IP


Service的IP,是一个虚拟IP,仅作用于service对象,由k8s管理和分配,需要结合service port才能使用,单独的IP没有通信功能,集群外访问需要一些修改。

1.7 部署DashBoard

参考文档:http://www.cnblogs.com/zhenyuyaodidiao/p/6500897.html

1.7.1 修改配置文件

编辑dashboard.yaml,注意或更改以下部分:

    image: index.tenxcloud.com/google_containers/kubernetes-dashboard-amd64:v1.4.1
            args:
         -  --apiserver-host=http://10.0.0.11:8080

编辑dashboardsvc.yaml文件:

apiVersion: v1
kind: Service
metadata:
  name: kubernetes-dashboard
  namespace: kube-system
  labels:
    k8s-app: kubernetes-dashboard
    kubernetes.io/cluster-service: "true"
spec:
  selector:
    k8s-app: kubernetes-dashboard
  ports:
  - port: 80
targetPort: 9090

1.7.2 镜像准备

在dashboard.yaml中定义了dashboard所用的镜像

gcr.io/google_containers/kubernetes-dashboard-amd64:v1.5.1(当然你可以选择其他的版本)

下载地址

docker pull registry.cn-hangzhou.aliyuncs.com/google-containers/kubernetes-dashboard-amd64:v1.4.1

1.7.3 启动dashboard

在master执行如下命令:

kubectl create -f dashboard.yaml
kubectl create -f dashboardsvc.yaml

到此dashboard搭建完成

1.7.4 验证

  命令验证,master上执行如下命令:

[[email protected] ~]# kubectl get deployment --all-namespaces
NAMESPACE     NAME                          DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
kube-system   kubernetes-dashboard-latest   1         1         1            1           42m
[[email protected]-master ~]# kubectl get svc  --all-namespaces
NAMESPACE     NAME                   CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
default       kubernetes             10.254.0.1      <none>        443/TCP          5h
default       myweb                  10.254.168.71   <nodes>       8080:30001/TCP   1h
kube-system   kubernetes-dashboard   10.254.90.78    <none>        80/TCP           41m
    [[email protected]-master ~]# kubectl get pod  -o wide  --all-namespaces
    NAMESPACE     NAME                                           READY     STATUS    RESTARTS   AGE       IP            NODE
    default       myweb-c2dfj                                    1/1       Running   0          1h        172.16.57.2   10.0.0.13
    default       myweb-h7rkb                                    1/1       Running   0          1h        172.16.76.2   10.0.0.12
    default       myweb-l48b3                                    1/1       Running   0          1h        172.16.57.3   10.0.0.13
    kube-system   kubernetes-dashboard-latest-1395490986-1t37v   1/1       Running   0          43m       172.16.76.3   10.0.0.12

1.7.5 浏览器访问:http://10.0.0.11:8080/ui

1.7.6 销毁应用(测试)

在master上执行:

kubectl delete deployment kubernetes-dashboard-latest --namespace=kube-system
kubectl delete svc  kubernetes-dashboard --namespace=kube-system

1.8 参考文献

[1] http://docs.kubernetes.org.cn/227.html

[2] http://www.cnblogs.com/zhenyuyaodidiao/p/6500830.html

原文地址:https://www.cnblogs.com/xiaoyuxixi/p/12142218.html

时间: 2024-07-31 05:07:30

kubernetes的简介及使用教程(转)的相关文章

Azkaban简介及安装教程

什么是Azkaban? Azkaban是一种类似于Oozie的工作流控制引擎,可以用来解决多个Hadoop计算任务之间的依赖关系问题. Azkaban由以下3个组件构成: 一.MySQL数据库 Azkaban使用MySQL来存储它的状态信息,Azkaban Executor Server和Azkaban Web Server均使用到了MySQL数据库. AzkabanExecutorServer在如下几个方面使用到了数据库: 1.获取project的信息 2.执行工作流 3.存储工作流运行日志

K8s(Kubernetes)简介及安装部署

前言: k8s是Kubernetes的简称,因为K和S之间有8个字母,所以才会被称为k8s. k8s最初是在Google公司内部使用了10多年的技术,它的前身是叫做Borg(博格),直到2015年才被Google公司捐赠为开源项目. 如果之前我们有接触过OpenStack,那么应该知道管理VM虚拟机资源可以用OpenStack.那么管理容器所对应的开源平台是什么呢?k8s就是其中之一,在k8s之前也有很多容器管理平台,有docker自身的docker swarm,也有apache推出的Mesos

中文分词工具简介与安装教程(jieba、nlpir、hanlp、pkuseg、foolnltk、snownlp、thulac)

2.1 jieba 2.1.1 jieba简介 Jieba中文含义结巴,jieba库是目前做的最好的python分词组件.首先它的安装十分便捷,只需要使用pip安装:其次,它不需要另外下载其它的数据包,在这一点上它比其余五款分词工具都要便捷.另外,jieba库支持的文本编码方式为utf-8. Jieba库包含许多功能,如分词.词性标注.自定义词典.关键词提取.基于jieba的关键词提取有两种常用算法,一是TF-IDF算法:二是TextRank算法.基于jieba库的分词,包含三种分词模式: 精准

MongoDB系列教程(八):GridFS存储详解

MongoDB系列教程(八):GridFS存储详解 GridFS简介 mongoDB的文档以BSON格式存储,支持二进制的数据类型,当我们把二进制格式的数据直接保存到mongoDB的文档中.但是当文件太大时,例如图片和视频等文件,每个文档的长度是有限的,于是mongoDb会提供了一种处理大文件的规范--GridFS. GridFS实现原理 在GridFS数据库中,默认使用fs.chunks 和fs.files来存储文件,其中fs.files集合存放文件的信息,fs.chunks存放文件的数据,一

JSP简明教程:汇总

原创JSP教程,简洁明了,不含废话. JSP简明教程(一):JSP简介 JSP简明教程(二):JSP基本语法 JSP简明教程(三):JSP隐含对象 JSP简明教程(四):EL表达式语言.JavaBean.Cookie.Session JSP简明教程(五):高级特性 JSP简明教程:汇总,布布扣,bubuko.com

flask 大型教程项目优化版(1):Hello World

Hello World 作者背景 作者是一个使用多种语言开发复杂程序并且拥有十多年经验的软件工程师.作者第一次学习 Python 是在为一个 C++ 库创建绑定的时候. 除了 Python,作者曾经用 PHP, Ruby, Smalltalk 甚至 C++ 写过 web 应用.在所有这些中,Python/Flask 组合是作者认为最为自由的一种. 应用程序简介 作为本教程的一部分–我要开发的应用程序是一个极具特色的微博服务器,我称之为 microblog . 我会随着应用程序的不断地进展将涉及到

ReactiveCocoa入门教程:第一部分

本文翻译自RayWenderlich,原文:ReactiveCocoa Tutorial--The Definitive Introduction: Part 1/2 作为一个iOS开发者,你写的每一行代码几乎都是在相应某个事件,例如按钮的点击,收到网络消息,属性的变化(通过KVO)或者用户位置的变化(通过CoreLocation).但是这些事件都用不同的方式来处理,比如action.delegate.KVO.callback等.ReactiveCocoa为事件定义了一个标准接口,从而可以使用一

ReactiveCocoa入门教程——第一部分

本文翻译自RayWenderlich,原文:ReactiveCocoa Tutorial--The Definitive Introduction: Part 1/2 作为一个iOS开发者,你写的每一行代码几乎都是在相应某个事件,例如按钮的点击,收到网络消息,属性的变化(通过KVO)或者用户位置的变化(通过CoreLocation).但是这些事件都用不同的方式来处理,比如action.delegate.KVO.callback等.ReactiveCocoa为事件定义了一个标准接口,从而可以使用一

Quartz 框架 教程(中文版)2.2.x

Quartz 框架 教程(中文版)2.2.x 之第一课 开始使用Quartz框架 Quartz 框架 教程(中文版)2.2.x 之第二课 Quartz API,Jobs和Triggers简介 Quartz 框架 教程(中文版)2.2.x 之第三课 更多关于Jobs和JobDetails Quartz 框架 教程(中文版)2.2.x 之第四课 更多关于Triggers Quartz 框架 教程(中文版)2.2.x 之第五课 SimpleTrigger Quartz 框架 教程(中文版)2.2.x