容器云平台

1、PAAS平台基础架构与环境说明

1.1、Docker简介及基本组件

1.Docker简介

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。

一个完整的Docker有以下几个部分组成:

  1. Docker Client客户端
  2. Docker Daemon守护进程
  3. Docker Image镜像
  4. Docker Container容器

Docker引擎Docker Engine是C/S架构,主要有以下部件组成:

服务器(Docker daemon):后台运行的Docker daemon进程。Daemon进程用于管理Docker对象,包括镜像(images)、容器(containers)、网络(networks)、数据卷(data volumes)。

REST接口:同daemon交互的REST API接口。

客户端(Docker client):命令行(CLI)交互客户端。客户端使用REST API接口同Docker daemon进行访问。Docker服务的架构图可以上百度搜,上传太慢

2.Docker平台组成

运行一个Docker服务,组成包括Docker daemon服务器、Docker Client客户端、Docker Image镜像、Docker Registry库、Docker Contrainer容器架构图可以上百度搜,上传太慢

(1)Docker镜像:

是一个只读模板,用于创建Docker容器,由Dockerfile文本描述镜像的内容。镜像定义类似“面对对象的类”,从一个基础镜像(Base Image)开始。构建一个镜像实际就是安装、配置和运行的过程,Docker镜像基于UnionFS把以上过程进行分层(Layer)存储,这样更新镜像可以只更新变化的层。Docker的描述文件为Dockerfile,Dockerfile是一个文本文件,基本指令包括:

FROM:定义基础镜像。

MAINTAINER :作者或维护者。

RUN:运行linux 命令。

ADD:增加文件或目录。

EVN:定义环境变量。

CMD:运行进程。

(2)Docker容器:

是一个镜像的运行实例。容器有镜像创建,运行过程例如:

运行ubuntu操作系统镜像,-I 前台交互模型,运行命令为/bin/bash

$ docker run -i -t ubuntu /bin/bash

运行过程如下:

拉取(pull)镜像,Docker Engine 检查ubuntu  镜像是否存在,如果本地已经存在,使用该镜像创建容器,如果不存在,Docker Engine从镜像库拉镜像。

使用该镜像创建新容器。

分配文件系统,挂载一个读写层,在读写层加载镜像。

分配网络/网桥接口,创建一个网络接口,让容器和主机通信。

从可用的IP池选择IP地址,分配给容器。

执行命令/bin/bash。

捕获和提供执行结果。

(3)Docker 仓库:

Docker仓库是Docker镜像库。Docker Registry也是一个容器。Docker Hub是Docker公司提供的互联网公共镜像仓库。可以构建自己本地的镜像仓库,国内有些公司也构建了镜像仓库。包括阿里云、新浪等。Docker 集群服务:Docker集群服务运行承租的Docker节点一起工作。目前支持swarm模式。

一个 Docker Registry 节点中可以包含多个仓库(Repository);每个仓库可以包含多个标签(Tag);每个标签对应一个镜像。

一般而言,一个仓库包含的是同一个软件的不同版本的镜像,而标签则用于对应于软件的的不同版本。可以通过 <仓库名>:<标签> 的格式来指定具体是哪个版本的镜像。如果不给出标签,将以 latest 作为默认标签。

Ubuntu 镜像 为例,ubuntu 是仓库的名字,其内包含有不同的版本标签,如,14.04, 16.04。可以通过 ubuntu:14.04,或者 ubuntu:16.04 来具体指定所需哪个版本的镜像。如果忽略了标签,比如ubuntu,那将视为 ubuntu:latest。

1.2、Kubernetes简介及基本组件

1.Kubernetes简介

KubernetesGoogle开源的容器集群管理系统,其提供应用部署、维护、 扩展机制等功能,如图1.3所示。利用Kubernetes能方便地管理跨机器运行容器化的应用,其主要功能总结如下:

1) 使用Docker对应用程序包装(package)、实例化(instantiate)、运行(run)

2) 以集群的方式运行、管理跨机器的容器。

3) 解决Docker跨机器容器之间的通讯问题。

4) Kubernetes的自我修复机制使得容器集群总是运行在用户期望的状态。

 

2.Kubernetes集群平台组成结构

Kubernetes总体包含两种角色,一个是Master节点,负责集群调度、对外接口、访问控制、对象的生命周期维护等工作;另一个是Node节点,负责维护容器的生命周期,例如创建、删除、停止Docker容器,负责容器的服务抽象和负载均衡等工作。其中Master节点上,运行着三个核心组件:API Server, Scheduler, Controller Mananger。Node节点上运行两个核心组件:Kubelet, Kube-Proxy。API Server提供Kubernetes集群访问的统一接口,Scheduler, Controller Manager, Kubelet, Kube-Proxy等组件都通过API Server进行通信,API Server将Pod, Service, Replication Controller, Daemonset等对象存储在ETCD集群中。ETCD是CoreOS开发的高效、稳定的强一致性Key-Value数据库,ETCD本身可以搭建成集群对外服务,它负责存储Kubernetes所有对象的生命周期,是Kubernetes的最核心的组件。

下面先大概介绍一下Kubernetes的核心组件的功能:

API Server: 提供了资源对象的唯一操作入口,其他所有的组件都必须通过它提供的API来操作资源对象。它以RESTful风格的API对外提供接口。所有Kubernetes资源对象的生命周期维护都是通过调用API Server的接口来完成,例如,用户通过kubectl创建一个Pod,即是通过调用API Server的接口创建一个Pod对象,并储存在ETCD集群中。

Controller Manager: 集群内部的管理控制中心,主要目的是实现Kubernetes集群的故障检测和自动恢复等工作。它包含两个核心组件:Node Controller和Replication Controller。其中Node Controller负责计算节点的加入和退出,可以通过Node Controller实现计算节点的扩容和缩容。Replication Controller用于Kubernetes资源对象RC的管理,应用的扩容、缩容以及滚动升级都是有Replication Controller来实现。

Scheduler: 集群中的调度器,负责Pod在集群的中的调度和分配。

Kubelet: 负责本Node节点上的Pod的创建、修改、监控、删除等Pod的全生命周期管理,Kubelet实时向API Server发送所在计算节点(Node)的信息。

Kube-Proxy: 实现Service的抽象,为一组Pod抽象的服务(Service)提供统一接口并提供负载均衡功能。

2、Kubernetes集群部署

2.1、系统说明

安装运行环境系统要求为CentOS7.5,内核版本不低于3.10。

Docker版本为docker-ce-19.03.13。

Kubernetes版本为1.18.1。

2.2、网络架构及硬件配置

节点角色

主机名

内存

硬盘

IP地址

Master Node

master

12G

100G

10.18.4.10

Worker Node

node

8G

100G

10.18.4.11

Harbor

master

12G

100G

10.18.4.10

2.3、基础环境部署

本次实验环境采用master + node两个节点部署,node节点可以根据需求自主扩展。

1)修改主机名并配置映射

所有节点修改主机名并配置映射。

master节点:

# hostnamectl set-hostname master

# cat /etc/hosts

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4

::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

10.18.4.10 master

10.18.4.11 node

node节点:

# hostnamectl set-hostname node

# cat /etc/hosts

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4

::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

10.18.4.10 master

10.18.4.11 node

2)关闭SELinux和防火墙

所有节点关闭SELinux:

# sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config

# setenforce 0

所有节点关闭防火墙:

# systemctl stop firewalld.service

# systemctl disable firewalld.service

3)删除iptables防火墙规则

所有节点清除iptables规则:

# iptables –F

# iptables –X

# iptables –Z

# /usr/sbin/iptables-save

4)配置yum源

将Chinaskill_Cloud_PaaS.iso镜像包上传至master节点。

master节点:

# mount -o loop Chinaskill_Cloud_PaaS.iso /mnt/

# cp -rfv /mnt/* /opt/

# umount /mnt/

# mv /etc/yum.repos.d/CentOS-* /home

# cat << EOF >/etc/yum.repos.d/local.repo

[k8s]

name=k8s

baseurl=file:///opt/kubernetes-repo

gpgcheck=0

enabled=1

EOF

master节点安装ftp服务器:

# yum install -y vsftpd

# vi /etc/vsftpd/vsftpd.conf

anon_root=/opt

# systemctl start vsftpd && systemctl enable vsftpd

node节点:

# mv /etc/yum.repos.d/CentOS-* /home

# cat << EOF >/etc/yum.repos.d/local.repo

[k8s]

name=k8s

baseurl=ftp://master/kubernetes-repo

gpgcheck=0

enabled=1

EOF

2.4、部署Harbor仓库

在master节点执行脚本k8s_harbor_install.sh即可完成harbor仓库的搭建,具体步骤参考如下(1)-(3)步骤。

1)安装Docker

Kubernetes默认的容器运行时仍然是Docker,使用的是kubelet中内置dockershim CRI实现。

所有节点安装Docker-ce:

# yum install -y yum-utils device-mapper-persistent-data lvm2

# yum install -y docker-ce

启动Docker:

# systemctl start docker

# systemctl enable docker

调整部分docker参数:

# tee /etc/docker/daemon.json <<-'EOF'

{

  "insecure-registries" : ["0.0.0.0/0"],

"registry-mirrors": ["https://5twf62k1.mirror.aliyuncs.com"],

  "exec-opts": ["native.cgroupdriver=systemd"]

}

EOF

# systemctl restart docker

2)安装docker-compose

在master节点安装docker-conpose:

# cp -rfv /opt/docker-compose/v1.25.5-docker-compose-Linux-x86_64 /usr/local/bin/docker-compose

# chmod +x /usr/local/bin/docker-compose

# docker-compose version

docker-compose version 1.25.5, build 8a1c60f6

docker-py version: 4.1.0

CPython version: 3.7.5

OpenSSL version: OpenSSL 1.1.0l  10 Sep 2019

3)部署Harbor

导入镜像:

# docker load -i /opt/images/Kubernetes.tar

解压安装包:

# cd harbor/

# tar -zxvf harbor-offline-installer-v2.1.0.tgz

# cd harbor

修改Harbor配置信息:

# cp harbor.yml.tmpl harbor.yml

# vi harbor.yml

hostname: 10.18.4.10  # 将域名修改为本机IP

harbor_admin_password: Harbor12345

#https:  # 禁用https

  # https port for harbor, default is 443

  # port: 443

  # The path of cert and key files for nginx

  # certificate: /your/certificate/path

  # private_key: /your/private/key/path

启动Harbor:

# ./prepare

# ./install.sh --with-clair

登录Harbor仓库(http://10.18.4.10

启动、停止Harbor:

# docker-compose up -d

# docker-compose stop

# docker-compose restart

4)上传镜像

将镜像导入Harbor仓库:

# cd /opt/images/

# ./k8s_image_push.sh

输入镜像仓库地址(不加http/https): 10.18.4.10

输入镜像仓库用户名: admin

输入镜像仓库用户密码: Harbor12345

您设置的仓库地址为: 10.24.2.32,用户名: admin,密码: xxx

是否确认(Y/N): Y

进入Harbor仓库library项目查看镜像列表

2.5、部署Kubernetes集群

在master节点执行脚本k8s_master_install.sh即可完成K8S集群的部署,具体步骤参考如下(1)-(4)步骤。

1)安装Kubeadm

所有节点安装Kubeadm工具:

# yum -y install kubeadm-1.18.1 kubectl-1.18.1 kubelet-1.18.1

# systemctl enable kubelet && systemctl start kubelet

2)初始化集群

在master节点初始化集群:

# kubeadm init --kubernetes-version=1.18.1 --apiserver-advertise-address=10.18.4.10 --image-repository registry.aliyuncs.com/google_containers --pod-network-cidr=10.244.0.0/16

[init] Using Kubernetes version: v1.18.1

[preflight] Running pre-flight checks

[preflight] Pulling images required for setting up a Kubernetes cluster

..................

[addons] Applied essential addon: CoreDNS

[addons] Applied essential addon: kube-proxy

Your Kubernetes control-plane has initialized successfully!

To start using your cluster, you need to run the following as a regular user:

  mkdir -p $HOME/.kube

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

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

You should now deploy a pod network to the cluster.

Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:

  https://kubernetes.io/docs/concepts/cluster-administration/addons/

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 10.18.4.10:6443 --token cxtb79.mqg7drycn5s82hhc \

    --discovery-token-ca-cert-hash sha256:d7465b10f81ecb32ca30459efc1e0efe4f22bfbddc0c17d9b691f611082f415c

初始化完成后执行:

# mkdir -p $HOME/.kube

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

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

查看集群状态:

# kubectl get cs

NAME              STATUS    MESSAGE             ERROR

scheduler            Healthy     ok

controller-manager     Healthy     ok

etcd-0               Healthy     {"health":"true"}

查看节点状态:

# kubectl get nodes

NAME     STATUS     ROLES    AGE     VERSION

master     NotReady     master     2m57s    v1.18.1

可以发现master处于notready状态,这是正常的,因为还没有网络插件,接下来安装网络后就变为正常了:

# kubectl apply -f yaml/kube-flannel.yaml

podsecuritypolicy.policy/psp.flannel.unprivileged created

clusterrole.rbac.authorization.k8s.io/flannel created

clusterrolebinding.rbac.authorization.k8s.io/flannel created

serviceaccount/flannel created

configmap/kube-flannel-cfg created

daemonset.apps/kube-flannel-ds created

# kubectl get pods -A

NAMESPACE     NAME            READY    STATUS    RESTARTS   AGE

kube-system   coredns-7ff77c879f-7vj79       1/1     Running   0          14m

kube-system   coredns-7ff77c879f-nvclj        1/1     Running   0          14m

kube-system   etcd-master                   1/1     Running   0          14m

kube-system   kube-apiserver-master           1/1     Running   0          14m

kube-system   kube-controller-manager-master   1/1     Running   0          14m

kube-system   kube-flannel-ds-d5p4g           1/1     Running   0          11m

kube-system   kube-proxy-2gstw              1/1     Running   0          14m

kube-system   kube-scheduler-master           1/1     Running   0          14m

# kubectl get nodes

NAME     STATUS   ROLES    AGE   VERSION

master      Ready     master     17m    v1.18.1

3)安装Dashboard

创建证书:

# mkdir dashboard-certs

# cd dashboard-certs/

# kubectl create namespace kubernetes-dashboard

# openssl genrsa -out dashboard.key 2048

Generating RSA private key, 2048 bit long modulus

......................................+++

...........................................................+++

e is 65537 (0x10001)

# openssl req -days 36000 -new -out dashboard.csr -key dashboard.key -subj '/CN=dashboard-cert'

# openssl x509 -req -in dashboard.csr -signkey dashboard.key -out dashboard.crt

Signature ok

subject=/CN=dashboard-cert

Getting Private key

# kubectl create secret generic kubernetes-dashboard-certs --from-file=dashboard.key --from-file=dashboard.crt -n kubernetes-dashboard

安装Dashboard:

# kubectl apply -f recommended.yaml

namespace/kubernetes-dashboard created

serviceaccount/kubernetes-dashboard created

service/kubernetes-dashboard created

secret/kubernetes-dashboard-certs created

secret/kubernetes-dashboard-csrf created

secret/kubernetes-dashboard-key-holder created

configmap/kubernetes-dashboard-settings created

role.rbac.authorization.k8s.io/kubernetes-dashboard created

clusterrole.rbac.authorization.k8s.io/kubernetes-dashboard created

rolebinding.rbac.authorization.k8s.io/kubernetes-dashboard created

clusterrolebinding.rbac.authorization.k8s.io/kubernetes-dashboard created

deployment.apps/kubernetes-dashboard created

service/dashboard-metrics-scraper created

deployment.apps/dashboard-metrics-scraper created

查看Dashboard 关联Pod和Service的状态:

# kubectl get pod,svc -n kubernetes-dashboard

NAME                              READY   STATUS    RESTARTS   AGE

pod/dashboard-metrics-scraper-6b4884c9d5-f7qxd   1/1     Running   0          62s

pod/kubernetes-dashboard-5585794759-2c6xt       1/1     Running   0          62s

NAME          TYPE      CLUSTER-IP     EXTERNAL-IP   PORT(S)    AGE

service/dashboard-metrics-scraper  ClusterIP  10.105.228.249  <none>  8000/TCP  62s

service/kubernetes-dashboard   NodePort  10.98.134.7  <none>  443:30000/TCP   62s

创建serviceaccount和clusterrolebinding

# kubectl apply -f dashboard-adminuser.yaml

serviceaccount/dashboard-admin created

clusterrolebinding.rbac.authorization.k8s.io/dashboard-admin-bind-cluster-role created

在火狐浏览器访问dashboard(https://IP:30000)

获取Token:

# kubectl -n kubernetes-dashboard describe secret $(kubectl -n kubernetes-dashboard get secret | grep dashboard-admin | awk '{print $1}')

Name:         dashboard-admin-token-x9fnq

Namespace:    kubernetes-dashboard

Labels:       <none>

Annotations:  kubernetes.io/service-account.name: dashboard-admin

              kubernetes.io/service-account.uid: f780f22d-f620-4cdd-ad94-84bf593ca882

Type:  kubernetes.io/service-account-token

Data

====

ca.crt:     1025 bytes

namespace:  20 bytes

token:      eyJhbGciOiJSUzI1NiIsImtpZCI6IkRWNXNrYWV6dFo4bUJrRHVZcmwtcTVpNzdFMDZYZjFYNzRzQlRyYmlVOGsifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJkYXNoYm9hcmQtYWRtaW4tdG9rZW4teDlmbnEiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiZGFzaGJvYXJkLWFkbWluIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiZjc4MGYyMmQtZjYyMC00Y2RkLWFkOTQtODRiZjU5M2NhODgyIiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50Omt1YmVybmV0ZXMtZGFzaGJvYXJkOmRhc2hib2FyZC1hZG1pbiJ9.h5BGk2yunmRcA8U60wIJh0kWpRLI1tZqS58BaDy137k1SYkvwG4rfG8MGnoDMAREWd9JIX43N4qpfbivIefeKIO_CZhYjv4blRefjAHo9c5ABChMc1lrZq9m_3Br_fr7GonsYulkaW6qYkCcQ0RK1TLlxntvLTi7gWMSes8w-y1ZumubL4YIrUh-y2OPoi2jJNevn4vygkgxtX5Y9LlxegVYJfeE_Sb9jV9ZL7e9kDqmBIYxm5PBJoPutjsTBmJf3IFrf6vUk6bBWtE6-nZgdf6FAGDd2W2-1YcidjITwgUvj68OfQ5tbB94EYlJhuoAGVajKxO14XaE9NH0_NZjqw

输入Token后进入Dashboard仪表盘界面

4)删除污点

出于安全考虑,默认配置下Kubernetes不会将Pod调度到Master节点。如果希望将master也当作Node节点使用,可以执行如下命令:

# kubectl taint node master node-role.kubernetes.io/master-

node/master untainted

2.6、node节点加入集群

在node节点执行脚本k8s_node_install.sh即可将node节点加入集群,具体步骤参考如下(1)-(2)步骤。

1)node节点加入集群

在node节点执行以下命令加入集群:

# kubeadm join 10.18.4.10:6443 \

--token cxtb79.mqg7drycn5s82hhc --discovery-token-ca-cert-hash \

sha256:d7465b10f81ecb32ca30459efc1e0efe4f22bfbddc0c17d9b691f611082f415c

2)查看节点信息

在master节点查看节点状态:

# kubectl get nodes

NAME    STATUS   ROLES    AGE   VERSION

master     Ready     master     56m    v1.18.1

node       Ready    <none>     60s    v1.18.1

 

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

离陌殇殃

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值