APP下载
报价宝  ›  科技  › 

容器化进阶Kubernetes快速入门课程

报价宝 来源:baojiabao.com 发布时间:2019-09-30 05:51:00 10月03日更新
报价宝综合消息容器化进阶Kubernetes快速入门课程

容器化进阶Kubernetes快速入门课程

1.Kubernetes概述

1.1Kubernetes介绍

1.1.1Kubernetes是什么及作用

Kubernetes(K8S)是Google在2014年释出的一个开源专案,用于自动化容器化应用程序的部署、扩充套件和管理。Kubernetes通常结合docker容器工作,并且整合多个执行着docker容器的主机丛集。 官网地址https://Kubernetes.io

中文社群 https://www.kubernetes.org.cn/docs

Kubernetes的目标是让部署容器化的应用简单并且高效,Kubernetes一个核心特点就是能够自主的管理容器来保 证云平台中的容器按照使用者的期望执行。以下是Kubernetes相关特性:

自动包装

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

横向缩放

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

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

储存编排

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

自我修复

重新启动失败的容器,在节点不可用时,替换和重新编排节点上的容器,终止不对使用者定义的健康检查做出 响应的容器,并且不会在客户端准备投放之前将其通告给客户端。

服务发现和负载均衡

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

金钥和配置管理

部署和更新金钥和应用程序配置,不会重新编译您的映象,不会在堆叠配置中暴露金钥(secrets)。 批处理

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

使用Kubernetes能做什么

Kubernetes是一个全新的基于容器技术的分散式架构领先方案(源于Brog,是google十几年经验的结晶); Kubernetes是一个开放的开发平台(无侵入性,现有系统很容器迁移到Kubernetes上);Kubernetes是一个完备 的分散式系统支撑平台(完善的丛集管理能力)。

使用Kubernetes可以在物理或虚拟机器的Kubernetes丛集上执行容器化应用,Kubernetes能够提供一个以容器为中 心的基础架构,满足在生产环境中执行应用的一些常见需求,如:

多个程序协同工作储存系统挂载Distributing secrets 应用健康检测

应用例项的复制

Pod自动伸缩/扩充套件Naming and discovering 负载均衡

滚动更新资源监控日志访问

排程应用程序提供认证和授权

为什么使用Kubernetes

使用Kubernetes最直接的感受就是我们可以轻装上阵的开发复杂的系统了;其次Kubernetes是在全面拥抱微服务 架构(微服务的核心就是将一个巨大的单体应用拆分成很多小的互相连线的微服务,一个微服务后面可能是多个实 例副本在支撑,副本数量可以随着系统负荷的变化而动态调整);最后Kubernetes系统架构具备超强的横向扩充套件 能力。

1.1.2Kubernetes快速入门

环境准备

关闭CentOS防火墙systemctl disable firewalld

systemctl stop firewalld

安装etcd和kubernetes软件

yum install -y etcd kubernetes 启动服务

systemctl start etcd

systemctl start docker

如果docker启动失败,请参考(vi /etc/sysconfig/selinux 把selinux后面的改为disabled,重启一波 机器,再重启docker就可以了)

systemctl start kube-apiserver

systemctl start kube-controller-manager

systemctl start kube-scheduler

systemctl start kubelet

systemctl start kube-proxy

配置

Tomcat配置

mytomcat.rc.yam

apiVersion: v1

kind: ReplicationController metadata:

name: mytomcat spec:

replicas: 2 selector:

app: mytomcat template: metadata:

labels:

app: mytomcat spec: containers:

- name: mytomcat image: tomcat:7-jre7 ports:

- containerPort: 8080

kubectl create -f mytomcat.rc.yaml

mytomcat.svc.yaml

apiVersion: v1 kind: Service metadata:

name: mytomcat spec:

type: NodePort ports:

- port: 8080

nodePort: 30001 selector:

app: mytomcat

kubectl create -f mytomcat.svc.yaml

问题解决

docker pull失败

解决方案1

1、yum install rhsm -y

2、docker pull registry.access.redhat.com/rhel7/pod-infrastructure:latest

如果以上两步解决问题了,那么就不需要在执行下面操作

3、docker search pod-infrastructure

4、docker pull docker.io/tianyebj/pod-infrastructure

5、docker tag tianyebj/pod-infrastructure 192.168.126.143:5000/pod-infrastructure 6、docker push 192.168.126.143:5000/pod-infrastructure

7、vi /etc/kubernetes/kubelet

修 改 KUBELET_POD_INFRA_CONTAINER="–pod-infra-container- image=192.168.126.143:5000/pod- infrastructure:latest"

8、重启服务

systemctl restart kube-apiserver systemctl restart kube-controller-manager systemctl restart kube-scheduler systemctl restart kubelet systemctl restart kube-proxy

解决方案2

1、docker pull kubernetes/pause

2 、 docker tag docker.io/kubernetes/pause:latest 192.168.126.143:5000/google_containers/pause-amd64.3.0

3、docker push 192.168.126.143:5000/google_containers/pause-amd64.3.0 4、vi /etc/kubernetes/kubelet配置为

KUBELET_ARGS="–

pod_infra_container_image=192.168.126.143:5000/google_containers/pause-amd64.3.0"

5、重启kubelet服务 systemctl restart kubelet

外部网不能访问

在搭建好的k8s丛集内建立的容器,只能在其所在的节点上curl可访问,但是在其他任何主机上无法访问 容器占用的埠

解决方案:

1、vim /etc/sysctl.conf

2、net.ipv4.ip_forward=1

解决 kubectl get pods时No resources found问题 1、vim /etc/kubernetes/apiserver 2、找到”KUBE_ADMISSION_CONTROL="-

admission_control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,Servi ceAccount,ResourceQuota",去掉ServiceAccount,储存退出。 3、systemctl restart kube-apiserver 重启此服务

浏览测试

1.2Kubernetes 基本架构与常用术语

Kubernetes丛集包含有节点代理kubelet和Master元件(APIs, scheduler, etc),一切都基于分散式的储存系统。下面这张图是Kubernetes的架构图。

在这张系统架构图中,我们把服务分为执行在工作节点上的服务和组成丛集级别控制板的服务。

Kubernetes节点有执行应用容器必备的服务,而这些都是受Master的控制。

每次个节点上当然都要执行Docker。Docker来负责所有具体的映像下载和容器执行。

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提供丛集日志采集、储存与查询

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.1Cluster

Cluster是计算、储存和网络资源的集合,Kubernetes利用这些资源执行各种基于容器的应用. Kubernetes Cluster由Master和Node组成,节点上执行着若干Kubernetes服务

1.2.1Master

Master主要职责是排程,即决定将应用放在哪执行。Master执行Linux系统,可以是物理机或虚拟机器。 Master是Kubernetes Cluster的大脑,执行着的Daemon服务包括kube-apiserver、kube-scheduler、kuber-controller- manager、etcd和Pod网络

API Serer(kube-apiserver)

API Server 提供HTTP/HTTPS RESTful API,即Kubernetes API.是Kubernetes里所有资源的CRUD等操作的唯一入口,也是丛集控制的入口程序

Scheduler(kube-scheduler)

Scheduler负责资源排程的里程,简单说,它决定将Pod放在哪个Node上执行

Controller Manager(kube-controller-manager)

所有资源物件的自动化控制中心。Controller Manager负责管理Cluster各种资源,保证资源处于预期的状态 。 Controller Manager 有 多 种 , 如 replication controller 、 endpoints controller 、 namespace controller、serviceaccounts controller等。

不同的controller管理不同的资源,如replication controller管理Deployment、StatefulSet、DaemonSet的生命周期,namespace controller管理Namespace资源

etcd

etcd负责储存Kubernetes Cluster的配置资讯和各种资源的状态资讯。当资料发生变化时,etcd会快速地通知Kubernetes相关元件

Pod网络

Pod要能够相互通讯,Kubernetes Cluster必须部署Pod网络,flannel是其中一个可选方案。

1.2.2Node

除了Master,Kubernetes丛集中的其它机器被称为Node节点。Node职责是执行容器应用,Node由Master管

理,Node负责监控并汇报容器的状态,同时根据Master的要求管理容器的生命周期。Node也执行在Linux系统, 可以是物理机或虚拟机器。

每个Node节点上都执行着以下一组关键程序

kubelet

负责Pod对应的容器的建立、启动等任务,同时与Master节点密切协作,实现丛集管理的基本功能

kube-proxy

实现Kubernetes Service的通讯与负载均衡机制的重要元件Docker Enginer

Docker引擎,负责本机的容器建立和管理工作

1.2.3Pod

Pod是Kubernetes的最小单元,也是最重要和最基本的概念。每一个Pod包含一个或多个容器,Pod的容器会作为 一个整体被Master排程到一个Node上执行。Kubenetes为每个Pod都分配了唯一的IP地址,称为PodIP,一个Pod里 的多个容器共享PodIP地址。在Kubernetes里,一个Pod里的容器与另外主机上的Pod容器能够直接通讯。

1.2.4Service

Kubernetes Service定义了外界访问一组特定Pod的方式,Service有自己的IP和埠,Service为Pod提供了负载均衡。它也是Kubernetes最核心的资源物件之一,每个Service其实就是我们经常提起的微服务架构中的一个"微服 务"。

1.2.5Replication Controller

Replication Controller(简称RC)是Kubernetes系统中的核心概念之一,它其实是定义了一个期望的场景,即宣告某种Pod的副本数量在任意时刻都符合某个预期值,所以RC的定义包括如下几个部分

Pod期待的副本数(replicas)

用于筛选目标Pod的Label Selector

当Pod的副本数量小于预期数量时,用于建立新Pod的Pod模板(template)

以下是总结的RC的一些特性与作用

在大多数情况下,我们通过定义一个RC实现Pod的建立过程及副本数量的自动控制

RC里包括完整的Pod定义模板

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

通过改变RC里的Pod副本数量,可以实现Pod的扩容或缩容功能 通过改变RC里Pod模板中映象版本,可以实现Pod的滚动升级功能

2.Kubernetes丛集

Kubernetes用于协调高度可用的计算机丛集,这些计算机群集被连线作为单个单元工作。Kubernetes 在一个丛集上以更有效的方式自动分发和排程容器应用程序。Kubernetes丛集由两种型别的资源组成:

Master是丛集的排程节点

Nodes是应用程序实际执行的工作节点

接下来为大家讲解一下如何快速部署一套Kubernetes丛集,K8S丛集部署有几种方式:kubeadm、minikube和二 进位制包。前两者属于自动部署,简化部署操作,我们这里强烈推荐初学者使用二进位制包部署,因为自动部署遮蔽了 很多细节,使得对各个模组感知很少,非常不利用学习。

2.1环境准备与规划

推荐配置2核2G

Docker version 17.05.0-ce

检视预设防火墙状态(关闭后显示not running ,开启后显示 running) firewall-cmd --state

关闭防火墙

systemctl stop firewalld.service

禁止firewall开机启动

systemctl disable firewalld.service

获取Kubernetes二进位制包

https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG-1.9.md

页面表格中找到Server Binaries中的kubernetes-server-linux-amd64.tar.gz档案,下载到本地。该压缩包中包括了k8s需要执行的全部服务程式档案

2.2Master安装

2.2.1Docker安装

(1)设定yum源

vi /etc/yum.repos.d/docker.repo

[dockerrepo] name=Docker Repository

baseurl=https://yum.dockerproject.org/repo/main/centos/$releasever/ enabled=1

gpgcheck=1 gpgkey=https://yum.dockerproject.org/gpg

(2)安装docker

yum install docker-engine

(3)安装后检视docker版本

docker -v

2.2.2etcd服务

etcd做为Kubernetes丛集的主要服务,在安装Kubernetes各服务前需要首先安装和启动。

下载etcd二进位制档案

https://github.com/etcd-io/etcd/releases

上传到master

可以使用lrzsz,如果没有安装,可以通过yum进行安装 yum install lrzsz

将将etcd和etcdctl档案复制到/usr/bin目录

配置systemd服务档案 /usr/lib/systemd/system/etcd.service

[Unit]

Description=Etcd Server After=network.target [Service]

Type=simple

EnvironmentFile=-/etc/etcd/etcd.conf

WorkingDirectory=/var/lib/etcd/

ExecStart=/usr/bin/etcd

Restart=on-failure [Install]

WantedBy=multi-user.target

启动与测试etcd服务

systemctl daemon-reload

systemctl enable etcd.servic

e mkdir -p /var/lib/etcd/

systemctl start etcd.service

etcdctl cluster-health

2.2.3kube-apiserver服务

解压后将kube-apiserver、kube-controller-manager、kube-scheduler以及管理要使用的kubectl二进位制命令档案放到/usr/bin目录,即完成这几个服务的安装。

cp kube-apiserver kube-controller-manager kube-scheduler kubectl /usr/bin/

下面是对kube-apiserver服务进行配置

编辑systemd服务档案 vi /usr/lib/systemd/system/kube-apiserver.service

[Unit]

Description=Kubernetes API Serve

r Documentation=https://github.com/kubernetes/kubernetes

After=etcd.service

Wants=etcd.service [Service]

EnvironmentFile=/etc/kubernetes/apiserver

ExecStart=/usr/bin/kube-apiserver $KUBE_API_ARGS

Restart=on-failure

Type=notify [Install]

WantedBy=multi-user.target

配置档案

建立目录:mkdir /etc/kubernetes

vi /etc/kubernetes/apiserver

KUBE_API_ARGS="--storage-backend=etcd3 --etcd-servers=http://127.0.0.1:2379 --insecure-bind- address=0.0.0.0 --insecure-port=8080 --service-cluster-ip-range=169.169.0.0/16 --service-node- port-range=1-65535 --admission- control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ServiceAccount,Defaul tStorageClass,ResourceQuota --logtostderr=true --log-dir=/var/log/kubernetes --v=2"

2.2.4kube-controller-manager服务

kube-controller-manager服务依赖于kube-apiserver服务:

配置systemd服务档案:vi /usr/lib/systemd/system/kube-controller-manager.servic

[Unit]

Description=Kubernetes Controller Manager Documentation=https://github.com/GoogleCloudPlatform/kubernetes After=kube-apiserver.service

Requires=kube-apiserver.service

[Service]

EnvironmentFile=-/etc/kubernetes/controller-manager ExecStart=/usr/bin/kube-controller-manager $KUBE_CONTROLLER_MANAGER_ARGS Restart=on-failure

LimitNOFILE=65536

[Install]

WantedBy=multi-user.target

配置档案 vi /etc/kubernetes/controller-manager

KUBE_CONTROLLER_MANAGER_ARGS="--master=http://192.168.126.140:8080 --logtostderr=true --log- dir=/var/log/kubernetes --v=2"

2.2.5kube-scheduler服务

kube-scheduler服务也依赖于kube-apiserver服务。

配置systemd服务档案:vi /usr/lib/systemd/system/kube-scheduler.service

[Unit]

Description=Kubernetes Scheduler

Documentation=https://github.com/GoogleCloudPlatform/kubernetes

After=kube-apiserver.service Requires=kube-apiserver.service

[Service]

EnvironmentFile=-/etc/kubernetes/scheduler ExecStart=/usr/bin/kube-scheduler $KUBE_SCHEDULER_ARGS Restart=on-failure

LimitNOFILE=65536

[Install]

WantedBy=multi-user.target

配置档案:vi /etc/kubernetes/scheduler

KUBE_SCHEDULER_ARGS="--master=http://192.168.126.140:8080 --logtostderr=true --log- dir=/var/log/kubernetes --v=2"

2.2.6启动

完成以上配置后,按顺序启动服务

systemctl daemon-reload

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

检查每个服务的健康状态:

systemctl status kube-apiserver.service

systemctl status kube-controller-manager.service systemctl status kube-scheduler.service

2.3Node1安装

在Node1节点上,以同样的方式把从压缩包中解压出的二进位制档案kubelet kube-proxy放到/usr/bin目录中。在Node1节点上需要预先安装docker,请参考Master上Docker的安装,并启动Docker

2.3.1kubelet服务

配置systemd服务档案:vi /usr/lib/systemd/system/kubelet.service

[Unit]

Description=Kubernetes Kubelet Server

Documentation=https://github.com/GoogleCloudPlatform/kubernetes

After=docker.service

Requires=docker.service

[Service] WorkingDirectory=/var/lib/kubelet

EnvironmentFile=-/etc/kubernetes/kubelet

ExecStart=/usr/bin/kubelet $KUBELET_ARGS

Restart=on-failure

KillMode=process

[Install]

WantedBy=multi-user.target

mkdir -p /var/lib/kubelet

配置档案:vi /etc/kubernetes/kubelet

KUBELET_ARGS="--kubeconfig=/etc/kubernetes/kubeconfig --hostname-override=192.168.126.142 -- logtostderr=false --log-dir=/var/log/kubernetes --v=2 --fail-swap-on=false"

用于kubelet连线Master Apiserver的配置档案

vi /etc/kubernetes/kubeconfig

apiVersion: v1 kind: Config clusters:

-cluster:

server: http://192.168.126.140:8080 name: local

contexts:

-context:

cluster: local name: mycontext

current-context: mycontext

2.3.2kube-proxy服务

kube-proxy服务依赖于network服务,所以一定要保证network服务正常,如果network服务启动失败,常见解决方案有以下几中:

1.和 NetworkManager 服务有冲突,这个好解决,直接关闭 NetworkManger 服务就好了, service NetworkManager stop,并且禁止开机启动 chkconfig NetworkManager off 。之后重启就好了

2.和配置档案的MAC地址不匹配,这个也好解决,使用ip addr(或ifconfig)检视mac地址, 将/etc/sysconfig/network-scripts/ifcfg-xxx中的HWADDR改为检视到的mac地址

3.设定开机启动一个名为NetworkManager-wait-online服务,命令为:

systemctl enable NetworkManager-wait-online.service

4.检视/etc/sysconfig/network-scripts下,将其余无关的网络卡位置档案全删掉,避免不必要的影响,即只留一个以ifcfg开头的档案

配置systemd服务档案:vi /usr/lib/systemd/system/kube-proxy.service

[Unit]

Description=Kubernetes Kube-proxy Server

Documentation=https://github.com/GoogleCloudPlatform/kubernetes

After=network.service

Requires=network.service

[Service] EnvironmentFile=/etc/kubernetes/proxy

ExecStart=/usr/bin/kube-proxy $KUBE_PROXY_ARGS

Restart=on-failure

LimitNOFILE=65536

KillMode=process

[Install]

WantedBy=multi-user.target

配置档案:vi /etc/kubernetes/proxy

KUBE_PROXY_ARGS="--master=http://192.168.126.140:8080 --hostname-override=192.168.126.142 -- logtostderr=true --log-dir=/var/log/kubernetes --v=2"

2.3.3启动

systemctl daemon-reload systemctl enable kubelet systemctl start kubelet systemctl status kubelet systemctl enable kube-proxy systemctl start kube-proxy systemctl status kube-proxy

2.4Node2安装

请参考Node1安装,注意修改IP

2.5健康检查与示例测试

检视丛集状态

检视master丛集元件状态

nginx-rc.yaml

apiVersion: v1

kind: ReplicationController metadata:

name: nginx spec:

replicas: 3 selector:

app: nginx template: metadata:

labels:

app: nginx spec: containers:

- name: nginx image: nginx ports:

- containerPort: 80

kubectl create -f nginx-rc.yaml

nginx-svc.yaml

apiVersion: v1

kind: Service

metadata:

name: nginx

spec:

type: NodePort ports:

- port: 80

nodePort: 33333 selector:

app: nginx

kubectl create -f nginx-svc.yaml

检视pod

检视具体pod详情

文章标签: 报价宝 降噪耳机价格 耳机价格 红米手机价格 华为手机价格 小米手机价格 电视机价格 笔记本电脑价格 笔记本价格 汽车价格 报价宝 手机价格 汽车价格 电视机价格 耳机价格