Kubernetes简介及环境搭建

什么是Kubernetes

Kubernetes是Google开源的容器集群管理系统,它将组成应用程序的容器组合成逻辑单元,以便于管理和服务发现。

Kubernetes在Docker技术的基础上,为容器化的应用提供部署运行、资源调度、服务发现和动态伸缩等一系列完整功能,提高了大规模容器集群管理的便捷性。

Kubernetes功能概要

服务发现和负载均衡

Kubernetes可以使用DNS名称或自己的IP地址公开容器,如果到容器的流量很大,Kubernetes可以负载均衡并分配网络流量,从而使部署稳定。

存储编排

Kubernetes允许挂载多种存储系统,例如本地存储、公共云提供商等。

自动部署和回滚

可以使用Kubernetes描述已部署容器的所需状态,它可以以受控的速率将实际状态更改为所需状态。

自动二进制打包

Kubernetes允许指定每个容器所需CPU和内存,当容器指定了资源请求时,Kubernetes可以做出更好的决策来管理容器的资源。

自我修复

Kubernetes重新启动失败的容器、替换容器、杀死不响应用户定义的运行状况检查的容器,并且在准备好服务之前不将其通告给客户端。

密钥与配置管理

Kubernetes存储和管理敏感信息(如密码、OAuth令牌和ssh密钥)。可以在不重建容器镜像的情况下部署和更新密钥和应用程序配置,也无需在堆栈配置中暴露密钥。

Kubernetes架构图

Kubernetes架构

Kubernetes主要包含主节点(Master Node)工作节点(Worker Node)

Master节点负责暴露应用程序的API、调度deployments和管理整个集群。每个工作节点都运行着容器运行时,(如Docker或者rkt)通过代理与主节点通信。

Worker节点同时运行着其它组件,如:日志、监控、服务发现和其它可选组件。工作节点是Kubernetes集群中真正运行应用的地方。

Master节点主要包含以下组件:

-ETCD:保存了整个集群的状态信息,默认监听23792380端口(2379提供服务,2380用于集群节点通信) -APTserver:操作资源的入口,提供认证、授权、权限控制、API注册和服务发现的机制,Kubelet直接与APIserver交互,默认端口6443。 -Controller Manager:负责管理集群的状态,如异常发现、自动扩容和滚动更新等,默认监听10252端口 -scheduler:负责根据Worker节点的性能、负载、数据位置等进行调度资源的调度,按照预定的调度策略将Pod调度到相应的机器上,默认监听10251端口

Worker节点主要包含以下组件:

-Kubelet:负责从APIserver接收Pod的创建请求,启动和停止Pod并且管理Pod的生命周期、数据卷以及网络,定期向Master节点上报本节点及Pod的基本信息 -Kube-proxy:负责服务发现和集群Service的负载均衡

各个组件的通信方式如下图所示:

Kubernetes组件间通信

Kubernetes核心概念

Pod

Pod是一个或多个容器的集合并扮演着Kuberntes集群中最核心的管理单元,Pod同时也充当着容器共享的上下文和资源的逻辑边界。一个Pod运行在一个Worker节点上,内部包含多个容器

Service

一组逻辑Pods和它们访问策略的抽象,为一组相同属性的Pods抽象出一个ClusterIP,允许Pod之间以及Pod与Service之间通过ClusterIP相互通信。当外部用户需要访问这些服务时,需要在定义Service时添加NodePort的扩展。

ReplicaSet

保证集群在任何时间点上都有指定数量的Pod副本,除非你需要定制滚动更新的策略或者不需要滚动更新,Kubernetes推荐使用Deployment而不是直接操作ReplicaSet

Deployment

Deployment主要职责是为了保证运行状态pod的数量,提供Pods滚动更新和ReplicaSets的控制器,支持滚动升级。

Label

用于标记资源对象(Pod、Service等),实现对象分组,联系各种Kubernetes资源的纽带,一个Service通过Label关联到后端的Pod上。Service定义一个Pod的label选择器,具备这个Label的Pod就会为此Service效力

Namespace

用于实现多租户隔离,在一个Kubernetes集群中可以使用Namespace创建多个“虚拟集群”,这些Namespace之间可以完全隔离,也可以通过某种方式,让一个Namespace中的服务可以访问到其他的namespace中的服务

在Ubuntu系统中安装Kubernetes集群

实例集群规划,一个master节点,3个worker节点

  • 192.168.100.100(master)
  • 192.168.100.101(node1)
  • 192.168.100.102(node2)
  • 192.168.100.103(node2)

安装docker并启动相应的服务

在master和worker节点都需要先安装docker


#安装docker
apt-get install docker.io

#注册docker守护进程到systemctl
systemctl enable docker

#启动docker守护进程
systemctl start docker

#验证安装是否成功
docker ps

安装Kubernetes

在master和worker节点都需要先安装Kubernetes组件


#添加Kubernetes GPG key
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add

#添加docker源仓库(第一个是国外源,第二个是国内阿里云)
apt-add-repository "deb http://apt.kubernetes.io/ kubernetes-xenial main"
apt-add-repository "deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main"

#安装Kubernetes必要组件
apt-get install kubeadm kubelet kubectl

关闭swap

要运行kubernetes,你必须首先关闭swap,master和worker节点都需要执行

#暂时关闭,
swapoff -a

#永久关闭,注释掉swap那一行就行
vim /etc/fstab

初始化master

下面操作只在master节点执行,首先需要初始化master,命令如下:

kubeadm init

初始化结束后,你将看到将worker node加入集群的精确命令,类似如下,tokencert会不同

kubeadm join 192.168.100.100:6443 --token aat409.plzb63oim93gjucq --discovery-token-ca-cert-hash sha256:5b906d68640eeddcd1381bf76dc0da5c522d71ceb89c547ac5a61fded064e54e

上述命令需要单独备份,如果你不慎遗失了该命令,可以在master节点上使用如下命令来重新生成一条

kubeadm token create --print-join-command

如果在初始化过程中出现了任何Error导致初始化终止了,可以使用如下命令重置之后再重新进行初始化。

kubeadm reset

接下来需要部署master节点的环境变量

#创建环境变量目录
mkdir -p $HOME/.kube
#初始化环境变量配置
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
#赋予执行权限
sudo chown $(id -u):$(id -g) $HOME/.kube/config

部署flannel网络

flannel是一个专门为kubernetes设置的网络规划服务,可以让集群中的不同节点主机创建的docker容器都具有全集群唯一的虚拟IP地址。

部署flannel网络使用如下命令:

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

部署Worker节点

部署worker节点的环境变量,需要用到master节点的/etc/kubernetes/admin.conf内容

#创建环境变量目录
mkdir -p $HOME/.kube
#初始化环境变量配置,填入master节点的/etc/kubernetes/admin.conf内容
vim $HOME/.kube/config
#赋予执行权限
sudo chown $(id -u):$(id -g) $HOME/.kube/config

运行加入集群命令

kubeadm join 192.168.100.100:6443 --token aat409.plzb63oim93gjucq --discovery-token-ca-cert-hash sha256:5b906d68640eeddcd1381bf76dc0da5c522d71ceb89c547ac5a61fded064e54e

当worker节点都加入master后,就可以通过如下命令查看集群状态

kubectl get nodes

#执行成功后会有类似输出
NAME         STATUS   ROLES    AGE   VERSION
kubemaster   Ready    master   38h   v1.18.5
node1        Ready    <none>   37h   v1.18.5
node2        Ready    <none>   37h   v1.18.5
node3        Ready    <none>   37h   v1.18.5

参考资料

-https://kubernetes.io/zh/docs/concepts/overview/what-is-kubernetes/ -https://juejin.im/post/5d86db1be51d4557ca7fde07 -http://ningg.top/kubernetes-series-03-architecture/ -https://jimmysong.io/kubernetes-handbook/concepts/ -https://www.jianshu.com/p/f2d4dd4d1fb1 -https://tonybai.com/2019/10/21/how-to-deploy-a-kubernetes-cluster-with-ubuntu-server-18-04/

分类

开发
    --go (9)
    --java (5)
    --php (11)
    --mysql (9)
    --javascript (3)
    --html (1)
    --算法 (6)
架构
    --理论 (9)
    --网络 (3)
    --服务器 (2)
    --消息队列 (3)
    --容器 (5)
    --监控 (1)
    --搜索引擎 (3)
    --大数据 (0)
    --测试 (1)
系统
    --linux (10)
    --mac (2)
    --windows (1)
足球
    --世界杯 (60)
    --欧洲杯 (28)
    --文迷 (3)
大学时光
    --校园生活 (96)
    --假期生活 (17)
    --广院杯那些事 (14)
    --北京奥运 (6)
    --胡思乱写 (17)


最近发布

零拷贝技术介绍

服务网格技术简介

C语言标准和标准库简介

Kubernetes简介及环境搭建

Go语言开发的顶级项目


归档

2006 (109)
2007 (40)
2008 (47)
2009 (10)
2010 (6)
2012 (10)
2013 (14)
2014 (27)
2015 (15)
2016 (6)
2017 (8)
2018 (11)
2019 (17)
2020 (5)