K8s基础原理

k8s中文社区:https://www.kubernetes.org.cn/

简介

Kubernetes与较早的集群管理系统Mesos和YARN相比,对容器尤其是 Docker的支持更加原生,同时提供了更强大的机制实现资源调度,自动 管理容器生命周期,负载均衡,高可用等底层功能,使开发者可以专注于开发应用。

Kubernetes是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简单并且高效(powerful),Kubernetes提供了应用部署,规划,更新,维护的一种机制。

K8s特性

Kubernetes是为生产环境而设计的容器调度管理系统,对于负载均衡、 服务发现、高可用、滚动升级、自动伸缩等容器云平台的功能要求有原生支持

一个K8s集群是由分布式存储(etcd)、服务节点(Minion, etcd现在称为Node)和控制节点(Master)构成的。所有的集群状态都保存在etcd中,Master节点上则运行集群的管理控制模块。Node节点是真正运行应用容器的主机节点,在每个Minion节点上都会运行一个Kubelet代理,控制该节点上的容器、镜像和存储卷等。

K8s架构图,介绍

Master(管理节点)

  • API Server:供Kubernetes API接口,主要处理 Rest操作以及更新Etcd中的对象。 所有资源增删改查的唯一入口。
  • Scheduler:绑定Pod到Node上,资源调度。
  • Controller Manager: 所有其他群集级别的功能,目前由控制器Manager执行。资源对象的 自动化控制中心。
  • Etcd:所有持久化的状态信息存储在Etcd中。

Node(计算节点)

  • Kubelet:管理Pods以及容器、镜像、Volume等,实现对集群 对节点的管理
  • Kube-proxy:提供网络代理以及负载均衡,实现与Service通讯。
  • Docker Engine:负责节点的容器的管理工作。

API SERVER(授权)

  • 只有API Server与存储通信,其他模块通过 API Server访问集群状态。
  • 一个工作节点的问题不影响集群体。
  • 在K8s集群中,所有的配置管理操作都声明 式而非命令式的。
  • 各个模块在内存中缓存自己的相关状态以 提高系统性能。

Scheduler(资源调度)

  • 负责集群的资源调度,根据特定的调度算法将pod调度到指定的minion上。
  • 这部分工作分出来变成一个组件,意味着可以很方便地替换成其他的调度器。
  • Scheduler调度器输入是待调度pod和可用的工作节点列表,输出则是应用调度 算法从列表中选择一个最优的用于绑定待调度的pod节点。

Controller Manager(控制管理中心)

  • Controller Manager作为集群内部的管理控制中心,负责集群内的Node、Pod副本、服务端点、命名空间、服务账号、资源定额等的管理并执行自动化修复流程,确保集群处于预期的工作状态
  • 在Kubernetes集群中,每个Controller就是一个操作系统,它通过API Server监控系统的共享状态,并尝试着将系统状态从“现有状态”修正到“期望状态”

POD(资源池)

  • Pod是K8s集群中所有业务类型的基础
  • Pod是在K8s集群中运行部署应用或服务的最小单元,它是可以支持多容器的。
  • Pod的设计理念是支持多个容器在一个Pod中共享网络地址和文件系统。
  • POD控制器Deployment、Job、DaemonSet和 PetSet

LABEL(标签)

  • Label是一个 key=value的键值对,由用户指定,可以附加到 K8S资源之上。
  • 给某个资源定义一个标签,随后可以通过label进行查询和筛选 ,类似SQL的where语句。
  • Label可以给对象创建多组标签

Replication Controller,RC

  • RC是K8s集群中最早的保证Pod高可用的API对象。通过监控运行中的Pod来保证集群中运行指定数目的Pod副本。
  • 指定的数目可以是多个也可以是1个;少于指定数目,RC就会启动运行新的Pod副本;多于指定数目,RC就会杀死多余的Pod副本。
  • 即使在指定数目为1的情况下,通过RC运行Pod也比直接运行Pod更明智,因为RC也可以发挥它高可用的能力,保证永远有1个Pod在运行。
PC总结
  • RC里包括完整的POD定义模板
  • RC通过Label Selector(标签选择器)机制实现对POD副本的自动控制。
  • 通过改变RC里的POD副本以实现POD的扩容和缩容
  • 通过改变RC里POD模块中的镜像版本,可以实现POD的滚动升级。

K8s组件

K8s安装配置

K8s安装方法

yum安装  1.5.2

二进制安装

kubeadm安装(官方)  需要梯子,全部容器化

minkube安装

编译安装

自动化安装

K8s资源

官网    kubernetes.io

中文社区  https://www.kubernetes.org.cn/

Github   https://github.com/kubernetes/kubernetes

命令行参考 https://kubernetes.io/docs/reference/generated/kub ectl/kubectl-commands#

K8s的安装环境要求

1、linux 内核3.10以上

2、64位系统

3、内存4G

4、安装epel

5、安装docker

6、开启yum cache保存安装RPM包

K8s中有三种类型的ip

物理ip(宿主机ip)

集群ip(cluster ip):10.254.0.0/16

pod(容器的ip):172.16.0.0/16

K8s安装与使用

安装

环境:三台机器,两个node(计算节点),一个主节点(master)

yum源需要:repo:CentOS-Base.repo  docker1.12

主节点(master)

主机名:K8s-master   ip:10.0.0.11   系统:centos7.2

yum install etcd -y
yum install docker -y
yum install kubernetes -y
yum install flannel -y

计算节点(node)

K8s-node-1   10.0.0.12   centos7.2

K8s-node-2   10.0.0.13    centos7.2

yum install docker -y
yum install kubernetes -y
yum install flannel -y

在master节点上

修改配置

修改etcd配置文件
[root@k8s-master ~]# vim /etc/etcd/etcd.conf
ETCD_NAME="default"
ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379"
ETCD_ADVERTISE_CLIENT_URLS="http://10.0.0.11:2379"

启动

systemctl enable etcd.service
systemctl start etcd.service

检查

[root@k8s-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
修改/etc/kubernetes/apiserver
vim /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_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ResourceQuota"
修改/etc/kubernetes/config
vim /etc/kubernetes/config
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

查看是否启动成功

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

在node节点

vim /etc/kubernetes/config
KUBE_MASTER="--master=http://10.0.0.11:8080"

node-1

vim /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"

node-2

vim /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"

启动检查

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

检查:

[root@k8s-master ~]# kubectl get nodes
NAME STATUS AGE
10.0.0.12 Ready 3m
10.0.0.13 Ready 3m

配置flannel网络

修改配置文件

master、node上均编辑/etc/sysconfig/flanneld

vim /etc/sysconfig/flanneld
FLANNEL_ETCD_ENDPOINTS="http://10.0.0.11:2379"

配置flannel的网络范围

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

实操:

[root@k8s-master ~]# 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

K8s常见命令操作

命令:kubectl create -f hello.yaml

文件内容:

[root@k8s-master ~]# vim hello.yaml
apiVersion: v1
kind: Pod
metadata:
name: hello-world
spec:
restartPolicy: Never
containers:
- name: hello
image: "docker.io/busybox:latest"
command: ["/bin/echo","hello”,”world"]

实操:

[root@k8s-master ~]# kubectl create -f hello.yaml
pod "hello-world" created kubectl get pods 查看默认name信息 kubectl describe pods hello-world 查看hello-world的详细信息
kubectl delete pods hello-world 删除名叫hello-world
kubectl replace -f nginx-rc.yaml 对已有资源进行更新、替换
kubectl edit rc nginx 对现有资源直接进行修改,立即生效
kubectl logs nginx-gt1jd    查看访问日志

存在的坑

因为没有证书,拉取图像失败。

[root@k8s-master ~]# kubectl describe pods hello-world
Name: hello-world
Namespace: default
Node: 10.0.0.13/10.0.0.13
Start Time: Fri, Feb :: +
Labels: <none>
Status: Pending
IP:
Controllers: <none>
Containers:
hello:
Container ID:
Image: docker.io/busybox:latest
Image ID:
Port:
Command:
/bin/echo
hello”,”world
State: Waiting
Reason: ContainerCreating
Ready: False
Restart Count:
Volume Mounts: <none>
Environment Variables: <none>
Conditions:
Type Status
Initialized True
Ready False
PodScheduled True
No volumes.
QoS Class: BestEffort
Tolerations: <none>
Events:
FirstSeen LastSeen Count From SubObjectPath Type Reason Message
--------- -------- ----- ---- ------------- -------- ------ -------
4m 4m {default-scheduler } Normal Scheduled Successfully assigned hello-world to 10.0.0.13
4m 1m {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 5s {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

创建:

[root@k8s-master ~]# kubectl create -f nginx.yaml
pod "hello-nginx" created

检查是否成功

[root@k8s-master ~]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE
hello-nginx / Running 2h 172.16.42.2 10.0.0.13

RC:保证高可用

  • RC是K8s集群中最早的保证Pod高可用的API对象。通过监控运行中的Pod来保证集群中运行指定数目的Pod副本。
  • 指定的数目可以是多个也可以是1个;少于指定数目,RC就会启动运行新的Pod副本;多于指定数目,RC就会杀死多余的Pod副本。
  • 即使在指定数目为1的情况下,通过RC运行Pod也比直接运行Pod更明智,因为RC也可以发挥它高可用的能力,保证永远有1个Pod在运行。

始终保持一个在活着

rc版yaml编写:

[root@k8s-master ~]# cat nginx-rc.yaml
apiVersion: v1
kind: ReplicationController
metadata:
name: nginx
spec:
replicas:
selector:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort:

启动rc版容器

[root@k8s-master ~]# kubectl create -f nginx-rc.yaml
replicationcontroller "nginx" created

检查:

[root@k8s-master ~]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE
nginx-gt1jd / Running 2m 172.16.79.2 10.0.0.12

这样的话就算删除了这个容器RC也会立马在起一个

版本升级

[root@k8s-master ~]# cat web-rc2.yaml
apiVersion: v1
kind: ReplicationController
metadata:
name: myweb-
spec:
replicas:
selector:
app: myweb-
template:
metadata:
labels:
app: myweb-
spec:
containers:
- name: myweb-
image: kubeguide/tomcat-app:v2
ports:
- containerPort:
env:
- name: MYSQL_SERVICE_HOST
value: 'mysql'
- name: MYSQL_SERVICE_PORT
value: ''

升级操作:

[root@k8s-master ~]# kubectl rolling-update myweb -f web-rc2.yaml
Created myweb-
Scaling up myweb- from to , scaling down myweb from to (keep pods available, don't exceed 3 pods)
Scaling myweb- up to
Scaling myweb down to
Scaling myweb- up to
Scaling myweb down to
Update succeeded. Deleting myweb
replicationcontroller "myweb" rolling updated to "myweb-2"

升级过程

[root@k8s-master ~]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE
myweb--mmlcm / Running 32s 172.16.42.3 10.0.0.13
myweb- / Running 2m 172.16.42.2 10.0.0.13
myweb-cx9j2 / Running 2m 172.16.79.3 10.0.0.12
nginx-gt1jd / Running 1h 172.16.79.2 10.0.0.12
[root@k8s-master ~]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE
myweb--0kmzf / Running 7s 172.16.79.4 10.0.0.12
myweb--mmlcm / Running 1m 172.16.42.3 10.0.0.13
myweb-cx9j2 / Running 2m 172.16.79.3 10.0.0.12
nginx-gt1jd / Running 1h 172.16.79.2 10.0.0.12

回滚

[root@k8s-master ~]# cat web-rc.yaml
apiVersion: v1
kind: ReplicationController
metadata:
name: myweb
spec:
replicas:
selector:
app: myweb
template:
metadata:
labels:
app: myweb
spec:
containers:
- name: myweb
image: kubeguide/tomcat-app:v1
ports:
- containerPort:
env:
- name: MYSQL_SERVICE_HOST
value: 'mysql'
- name: MYSQL_SERVICE_PORT
value: ''

操作:

[root@k8s-master ~]# kubectl rolling-update myweb- -f web-rc.yaml
Created myweb
Scaling up myweb from to , scaling down myweb- from to (keep pods available, don't exceed 3 pods)
Scaling myweb up to
Scaling myweb- down to
Scaling myweb up to
Scaling myweb- down to
Update succeeded. Deleting myweb-
replicationcontroller "myweb-2" rolling updated to "myweb"

检查

[root@k8s-master ~]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE
myweb-mbndc / Running 1m 172.16.79.3 10.0.0.12
myweb-qh38r / Running 2m 172.16.42.2 10.0.0.13
nginx-gt1jd / Running 1h 172.16.79.2 10.0.0.12

svc设置

[root@k8s-master ~]# cat web-svc.yaml
apiVersion: v1
kind: Service
metadata:
name: myweb
spec:
type: NodePort
ports:
- port:
nodePort:
selector:
app: myweb
[root@k8s-master ~]# kubectl create  -f web-svc.yaml
[root@k8s-master ~]# kubectl get svc
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes 10.254.0.1 <none> /TCP 6h
myweb 10.254.91.34 <nodes> :/TCP 1m

然后取node节点检查30001端口是否启动

然后浏览器web访问node节点的ip:30001进行测试

web界面管理

[root@k8s-master ~]# cat dashboard.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
# Keep the name in sync with image version and
# gce/coreos/kube-manifests/addons/dashboard counterparts
name: kubernetes-dashboard-latest
namespace: kube-system
spec:
replicas:
template:
metadata:
labels:
k8s-app: kubernetes-dashboard
version: latest
kubernetes.io/cluster-service: "true"
spec:
containers:
- name: kubernetes-dashboard
image: index.tenxcloud.com/google_containers/kubernetes-dashboard-amd64:v1.4.1
resources:
# keep request = limit to keep this container in guaranteed class
limits:
cpu: 100m
memory: 50Mi
requests:
cpu: 100m
memory: 50Mi
ports:
- containerPort:
args:
- --apiserver-host=http://10.0.0.11:8080
livenessProbe:
httpGet:
path: /
port:
initialDelaySeconds:
timeoutSeconds:

操作:

[root@k8s-master ~]# cat dashboard-svc.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:
targetPort:

启动:

kubectl create -f dashboard.yaml
kubectl create -f dashboard-svc.yaml

然后访问:http://10.0.0.11:8080/ui/

Docker集群编排工具之Kubernetes(K8s)介绍、安装及使用的更多相关文章

  1. Docker集群管理工具 - Kubernetes 部署记录 (运维小结)

    一.  Kubernetes 介绍 Kubernetes是一个全新的基于容器技术的分布式架构领先方案, 它是Google在2014年6月开源的一个容器集群管理系统,使用Go语言开发,Kubernete ...

  2. Centos下安装Docker集群管理工具Shipyard

    一. Docker Shipyard是什么 ? shipyard是一个开源的docker管理平台,其特性主要包括: 支持镜像管理.容器管理. 支持控制台命令 容器资源消耗监控 支持集群swarm,可以 ...

  3. docker集群管理之kubernetes

    一.简介 kubernetes又叫做k8s,是Google开发的一款开源的docker集群管理工具,在这里对它的“发家史”,我不做过多的阐述,有时间大家可以自己去百度一下: 下面我要讲的就是容易混淆的 ...

  4. centos7上基于kubernetes的docker集群管理

    kubernetes和docker的作用这里就不作介绍了,直接进入主题. 本文的目的是搭建docker集群,并使用kubernetes管理它们. 文中的软件环境除了kubernetes和docker, ...

  5. docker集群管理之swarm

    一.简介 docker集群管理工具有swarm.k8s.mesos等,我所用到的是swarm和k8s,这篇文章主要介绍swarm:swarm是docker集成的原生 管理工具,只要你安装上docker ...

  6. Docker 集群环境实现方式

    Docker 集群环境实现的新方式 近几年来,Docker 作为一个开源的应用容器引擎,深受广大开发者的欢迎.随着 Docker 生态圈的不断建设,应用领域越来越广.云计算,大数据,移动技术的快速发展 ...

  7. Docker 集群环境实现的新方式

    近几年来,Docker 作为一个开源的应用容器引擎,深受广大开发者的欢迎.随着 Docker 生态圈的不断建设,应用领域越来越广.云计算,大数据,移动技术的快速发展,加之企业业务需求的不断变化,紧随技 ...

  8. Docker集群管理(一)—— 基础docker+swarm+shipyard

    目的 学习docker的集群管理,摸索出高可用的docker微服务架构方案.本篇文章只初步的了解下swarm(docker新版已集成了swarm)的使用,了解docker的发现服务的基础方法(dock ...

  9. Kubernetes(k8s) docker集群搭建

    原文地址:https://blog.csdn.net/real_myth/article/details/78719244 一.Kubernetes系列之介绍篇   •Kubernetes介绍 1.背 ...

随机推荐

  1. CURL处理POST、GET请求

    Curl是一个库,它允许你通过各种协议和各种不同的服务器进行连接和通讯 a.php <?php function curlRequest($url,$data=''){ $ch=curl_ini ...

  2. 【转】MATLAB图形句柄(二)

        MATLAB图形句柄   1.1 图形对象及其句柄 1.2 图形对象属性 1.3 图形对象的创建 1.1 图形对象及其句柄 1.图形对象 MATLAB的图形对象包括计算机屏幕.图形窗口.坐标轴 ...

  3. 二叉查找树(Binary Sort Tree)(转)

    二叉查找树(Binary Sort Tree) 我们之前所学到的列表,栈等都是一种线性的数据结构,今天我们将学习计算机中经常用到的一种非线性的数据结构--树(Tree),由于其存储的所有元素之间具有明 ...

  4. linux的定时任务服务crond(crontab)服务

    1,Crond: Crond是linux系统中用来定期执行命令或指定程序任务的一种服务或者软件.(Centos5以后默认存在) 当优化开机自启动的时候,第一个就是crond. Crond服务默认情况( ...

  5. [DeeplearningAI笔记]改善深层神经网络_优化算法2.1_2.2_mini-batch梯度下降法

    觉得有用的话,欢迎一起讨论相互学习~Follow Me 2.1 mini-batch gradient descent mini-batch梯度下降法 我们将训练数据组合到一个大的矩阵中 \(X=\b ...

  6. dom4j读取xml

    -----记录和回顾是一个比学习更重要的环节----- 一.首先,我们需要知道xml是做什么的 1.作为软件的配置文件 2.作为数据的载体(小型的数据库) 二.xml的语法 xml文件以xml后缀名结 ...

  7. ABP官方文档翻译 3.7 领域事件(事件总线)

    领域事件(事件总线) 事件总线 注入IEventBus 获取默认实例 定义事件 预定义事件 处理异常 实体更改 触发事件 处理事件 处理基础事件 处理者异常 处理多个事件 注册处理者 自动 手动 取消 ...

  8. Maven pom.xml简单归结

    Maven pom.xml文件解释 请确保有相关的maven知识,包括Maven安装.Maven settings.xml解读.本文对POM的一些属性作一些摘录,详细的配置可查看此篇转载文章" ...

  9. jdk环境变量配置及配置原因

    windows下: 一.设置环境变量 变量名:JAVA_HOME 变量值:D:\Program Files\Java\jdk1.6.0  (即jdk安装的位置) 变量名:Path  (这个变量名已在系 ...

  10. Linux中的Buffer 与 Cache

    A buffer is something that has yet to be "written" to disk.       A cache is something tha ...