容器技术-Kubernetes

之前通过docker swarm的介绍,让大家对容器平台引擎有了一个基本的认识,下面来主要介绍和学习当前比较流行docker平台管理引擎Kubernetes,这也是当前云计算最火的基础技术架构。

一、通过一个实例来认识K8S

在正式的介绍K8S之前,先通过一个例子,让大家对K8S有一个浅显的认识,这里有一个网站,是kubernetes.io 开发的一个交互式教程,通过 Web 浏览器就能使用预先部署好的一个 kubernetes 集群,快速体验 kubernetes 的功能和应用场景:

 https://kubernetes.io/docs/tutorials/kubernetes-basics/

通过点击Create a Cluster -> Interactive Tutorial - Creating a Cluster界面,然后通过minikube start命令来创建一个单节点的K8S集群。可以通过kubectl get nodes查看如下信息:

执行 kubectl cluster-info 查看集群信息。

下面来创建一个应用(deployment),执行命令:

kubectl run kubernetes-bootcamp \
      --image=docker.io/jocatalin/kubernetes-bootcamp:v1 \
      --port=8080

 执行结果如下:

 默认情况下,所有 Pod 只能在集群内部访问。对于上面这个例子,要访问应用只能直接访问容器的 8080 端口。为了能够从外部访问应用,我们需要将容器的 8080 端口映射到节点的端口。

执行如下命令:

kubectl expose deployment/kubernetes-bootcamp \
      --type="NodePort" \
      --port 8080

 执行命令 kubectl get services 可以查看应用被映射到节点的哪个端口。

 kubernetes 是默认的 service,暂时不用考虑。kubernetes-bootcamp 是我们应用的 service,8080 端口已经映射到 host01 的 32320 端口,端口号是随机分配的,可以执行如下命令访问应用:

curl minikube:30877

执行显示结果如下:

执行kubectl get deployments命令,可以看到当前应用只有一个副本:

执行如下命令将副本数增加到 3 个:

kubectl scale deployments/kubernetes-bootcamp --replicas=3

通过 kubectl get pods 也可以看到当前 Pod 也增加到 3 个。

通过 curl 访问应用,可以看到每次请求发送到不同的 Pod,这样就实现了负载均衡。

要 scale down 也很方便,执行命令:

kubectl scale deployments/kubernetes-bootcamp --replicas=2

当前应用使用的 image 版本为 v1,执行如下命令将其升级到 v2:

kubectl set image deployments/kubernetes-bootcamp kubernetes-bootcamp=jocatalin/kubernetes-bootcamp:v2

如果要回退到 v1 版本也很容易,执行 kubectl rollout undo 命令:

kubectl rollout undo deployments/kubernetes-bootcamp

二、部署K8S cluster

在介绍怎么部署k8s cluster之前,先学习 Kubernetes 的几个重要概念,它们是组成 Kubernetes 集群的基石。

(一)基本概念:

1、Cluster 

Cluster 是计算、存储和网络资源的集合,Kubernetes 利用这些资源运行各种基于容器的应用。

2、Master 

Master 是 Cluster 的大脑,它的主要职责是调度,即决定将应用放在哪里运行。Master 运行 Linux 操作系统,可以是物理机或者虚拟机。为了实现高可用,可以运行多个 Master。

3、Node 

Node 的职责是运行容器应用。Node 由 Master 管理,Node 负责监控并汇报容器的状态,并根据 Master 的要求管理容器的生命周期。Node 运行在 Linux 操作系统,可以是物理机或者是虚拟机。

4、Pod

Pod 是 Kubernetes 的最小工作单元。每个 Pod 包含一个或多个容器。Pod 中的容器会作为一个整体被 Master 调度到一个 Node 上运行。

这样做基于两个目的:

a、可管理性。有些容器天生就是需要紧密联系,一起工作。Pod 提供了比容器更高层次的抽象,将它们封装到一个部署单元中。Kubernetes 以 Pod 为最小单位进行调度、扩展、共享资源、管理生命周期。

b、通信和资源共享。Pod 中的所有容器使用同一个网络 namespace,即相同的 IP 地址和 Port 空间。它们可以直接用 localhost 通信。同样的,这些容器可以共享存储,当 Kubernetes 挂载 volume 到 Pod,本质上是将 volume 挂载到 Pod 中的每一个容器。

5、Controller 

Kubernetes 通常不会直接创建 Pod,而是通过 Controller 来管理 Pod 的。Controller 中定义了 Pod 的部署特性,比如有几个副本,在什么样的 Node 上运行等。为了满足不同的业务场景,Kubernetes 提供了多种 Controller,包括 Deployment、ReplicaSet、DaemonSet、StatefuleSet、Job 等,我们逐一讨论。

a、Deployment 是最常用的 Controller,比如前面在线教程中就是通过创建 Deployment 来部署应用的。Deployment 可以管理 Pod 的多个副本,并确保 Pod 按照期望的状态运行。

b、ReplicaSet 实现了 Pod 的多副本管理。使用 Deployment 时会自动创建 ReplicaSet,也就是说 Deployment 是通过 ReplicaSet 来管理 Pod 的多个副本,我们通常不需要直接使用 ReplicaSet。

c、DaemonSet 用于每个 Node 最多只运行一个 Pod 副本的场景。正如其名称所揭示的,DaemonSet 通常用于运行 daemon。

d、StatefuleSet 能够保证 Pod 的每个副本在整个生命周期中名称是不变的。而其他 Controller 不提供这个功能,当某个 Pod 发生故障需要删除并重新启动时,Pod 的名称会发生变化。同时 StatefuleSet 会保证副本按照固定的顺序启动、更新或者删除。

e、Job 用于运行结束就删除的应用。而其他 Controller 中的 Pod 通常是长期持续运行。

6、Service 

Deployment 可以部署多个副本,每个 Pod 都有自己的 IP,要知道 Pod 很可能会被频繁地销毁和重启,它们的 IP 会发生变化,外界用 IP 来访问不太现实。那么外界如何访问这些副本呢?答案是 Service。

Kubernetes Service 定义了外界访问一组特定 Pod 的方式。Service 有自己的 IP 和端口,Service 为 Pod 提供了负载均衡。

Kubernetes 运行容器(Pod)与访问容器(Pod)这两项任务分别由 Controller 和 Service 执行。

7、Namespace

如果有多个用户或项目组使用同一个 Kubernetes Cluster,Namespace 可以将一个物理的 Cluster 逻辑上划分成多个虚拟 Cluster,每个 Cluster 就是一个 Namespace。不同 Namespace 里的资源是完全隔离的。

Kubernetes 默认创建了两个 Namespace。

default -- 创建资源时如果不指定,将被放到这个 Namespace 中。

kube-system -- Kubernetes 自己创建的系统资源将放到这个 Namespace 中。

(二)、部署K8s cluster

这里将部署三个节点的K8s cluster,分别如下:

k8s-master 是 Master,k8s-node1 和 k8s-node2 是 Node。

官方安装文档可以参考 https://kubernetes.io/docs/setup/independent/install-kubeadm/

1、安装docker

所有节点都需要安装 Docker。

apt-get update && apt-get install docker.io

2、安装 kubelet、kubeadm 和 kubectl

kubelet 运行在 Cluster 所有节点上,负责启动 Pod 和容器。

kubeadm 用于初始化 Cluster。

kubectl 是 Kubernetes 命令行工具。通过 kubectl 可以部署和管理应用,查看各种资源,创建、删除和更新各种组件。

apt-get update && apt-get install -y apt-transport-https

curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -cat <<EOF >/etc/apt/sources.list.d/kubernetes.list

deb http://apt.kubernetes.io/ kubernetes-xenial main

EOF

apt-get updateapt-get install -y kubelet kubeadm kubectl

3、用 kubeadm 创建 Cluster

完整的官方文档可以参考 https://kubernetes.io/docs/setup/independent/create-cluster-kubeadm/

4、初始化 Master

在 Master 上执行如下命令:

kubeadm init --apiserver-advertise-address 192.168.56.105 --pod-network-cidr=10.244.0.0/16

--apiserver-advertise-address 指明用 Master 的哪个 interface 与 Cluster 的其他节点通信。如果 Master 有多个 interface,建议明确指定,如果不指定,kubeadm 会自动选择有默认网关的 interface。

--pod-network-cidr 指定 Pod 网络的范围。Kubernetes 支持多种网络方案,而且不同网络方案对 --pod-network-cidr 有自己的要求,这里设置为 10.244.0.0/16 是因为我们将使用 flannel 网络方案,必须设置成这个 CIDR。在后面的实践中我们会切换到其他网络方案,比如 Canal。

5、配置 kubectl

kubectl 是管理 Kubernetes Cluster 的命令行工具,前面我们已经在所有的节点安装了 kubectl。Master 初始化完成后需要做一些配置工作,然后 kubectl 就能使用了。

依照 kubeadm init 输出中的提示,推荐用 Linux 普通用户执行 kubectl(root 会有一些问题)。

我们为 ubuntu 用户配置 kubectl:

su - ubuntu

mkdir -p $HOME/.kube

sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

sudo chown $(id -u):$(id -g) $HOME/.kube/config

为了使用更便捷,启用 kubectl 命令的自动补全功能。

echo "source <(kubectl completion bash)" >> ~/.bashrc

这样 ubuntu 用户就可以使用 kubectl 了。

上面我们通过 kubeadm 在 k8s-master 上部署了 Kubernetes,下面介绍安装 Pod 网络并添加 k8s-node1 和 k8s-node2,完成集群部署。

6、安装 Pod 网络

要让 Kubernetes Cluster 能够工作,必须安装 Pod 网络,否则 Pod 之间无法通信。

Kubernetes 支持多种网络方案,这里我们先使用 flannel,后面还会讨论 Canal。

执行如下命令部署 flannel:

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

7、添加 k8s-node1 和 k8s-node2

在 k8s-node1 和 k8s-node2 上分别执行如下命令,将其注册到 Cluster 中:

kubeadm join --token d38a01.13653e584ccc1980 192.168.56.105:6443

这里的 --token 来自前面 kubeadm init 输出的提示,如果当时没有记录下来可以通过 kubeadm token list 查看。

595.png

根据提示,我们可以通过 kubectl get nodes 查看节点的状态。

596.png

目前所有节点都是 NotReady,这是因为每个节点都需要启动若干组件,这些组件都是在 Pod 中运行,需要首先从 google 下载镜像,我们可以通过如下命令查看 Pod 的状态:

kubectl get pod --all-namespaces

597.png

PendingContainerCreatingImagePullBackOff 都表明 Pod 没有就绪,Running 才是就绪状态。我们可以通过 kubectl describe pod <Pod Name> 查看 Pod 具体情况,比如:

kubectl describe pod kube-flannel-ds-v0p3x --namespace=kube-system

等待一段时间,image 都成功下载后,所有 Pod 会处于 Running 状态。这时,所有的节点都已经 Ready,Kubernetes Cluster 创建成功,一切准备就绪。

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 2
  template: 
    metadata:
      labels: 
        k8s-app: web_server
    spec: 
      containers: 
        - 
          name: nginx
          image: nginx:1.7.9

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值