「Kubernetes」- 集群部署(供演示使用,不具备生产参考价值)

  CREATED BY JENKINSBOT

问题描述

在初期学习时,需要部署 Kubernetes 测试集群,用于测试演示与体验,及部分单主集群的升级测试;

“低配集群”,一个 Master 节点,一个 Node 节点,只能用于基础测试与简单演示,无法用于生产环境。在生产环境中,集群高可用,比如容灾、稳定性、故障恢复等等,是必须考虑的问题;

该部分笔记将整理:与 Kubernetes Testing Cluster 搭建有关的杂记,以及常见问题解决方案;

解决方案

kubeadm:创建 Single Master 的集群,用于学习目的;
minikube:快速创建本地集群,聚焦于应用开发及新用户;
K3s:轻量级 Kubernetes 集群;
kind:多用于 Local Development 与 CI 流程;(WIP)

on Google Kubernetes Engine (GKE)

在 GKE 上创建集群:Google Kubernetes Engine

GKE Quick Start: 「Quickstart | Kubernetes Engine Documentation | Google Cloud

Google Cloud Shell: 「Quickstart | Cloud Shell | Google Cloud

on Azure Container Service (ACS)

在 ACS 上创建集群。「Azure Container Serivice」

Creating a Cluster with kubicorn

如何在 AWS 上创建 Kubernetes 集群?

可以使用 kubicorn Kubernetes 集群。目前 kubicorn 没有可以执行文件的形式发布,所以下面的操作需要先安装 Go 才能进行;

首先,安装 kubicorn,并确认安装了 Go(.8 或更高版本)。在这里,我们使用 Centos 环境;

# go version

# go version go1. 8 linux/amd64

# yum group install”Development Tools”

# yum install ncurses-devel

# go get github. com/kris-nova/kubicorn

安装了 kubicorn profile 创建集群资源,并确认正确地定义了资源:

# kubicorn create –name k8scb–profile aws

# cat state/k8scb/cluster.yaml

!!!默认的资源 profile 假设在~/.ssh 中有一对名叫 id_rsa 的私钥和和 id_rsa.pub 的公钥。如果公钥和私钥不在~/.ssh 下,那么可能需要做些改动。请注意以上我们使用的区域是 Oregon,us-west-2,

接下来,你需要准备一个 AWS 身份和访问管理用户(Identity and Access Management,并拥有以下权限 Amazon C2FullAccess 、AutoScalingFullAccess、AmazonVPCFullAccess 如果你没有这样的 iaM 用户,现在就创建一个吧

kubicorn 的最后一项准备工作是将 IAM 的认证设置到环境变量中,如下所示:

export AWS_ACCESS_KEY_ID=*******

export AWS_SECRET_ACCESS_KEY=******

现在根据上述资源的定义以及提供的 AWS 访问权限创建集群:

kubicorn apply –name k8scb

实际上成功的是绿色的,告诉你一切设置成功。你也可以在浏览器中访问亚马逊的 EC2 控制台来进行确认

现在,按照 kubicorn apply 命令最后一行输出的指示,在集群中运行:

# ssh: ssh-i”/.ssh/id_rsa ubuntu@34.213.102.27

# kubectl get all -n kube-system

完成上述工作之后,别忘了销毁 Kubernetes 集群了(请注意可能需要花费几分钟的时间):

# kubicorn delete–name k8scb

尽管 kubicorn 还是一个很新的项目,但是它已经发展健全,你还可以在 Azure u Digital Ocean 上使用它创建集群;
因为 kubicorn kubicorn 在配置方面非常灵活,操作非常直观,尤其是如果你有管理员的背景;

kubicornx 文档“在 AWS 中设置 Kubernetes”
http/kubicorn.io documentation/aws-walkthrough html

Lachlan Evensond 在 Digital Ocean 上建立 kubernetes 集群
https://www.youtube.com/watch?v=XpxgSz3dspE

集群环境

目前已经搭建两套测试集群:实验集群(单控制节点);高可用集群;

高可用集群:

系统环境: CentOS Linux release 7.4.1708 (Core)
软件版本: Kubernetes v1.12.1
  Docker version 18.06.1-ce, build e68fc7a
  Helm v3.0.0-beta.3
网络信息: k8s-master[1-3]:10.10.50.91 – 93
  node[1-6]:10.10.50.81 – 86
  VIP:10.10.50.90

实验集群(单控制节点):

系统环境: CentOS Linux release 7.5.1804 (Core)
软件版本: Kubernetes v1.14.0
  Docker version 19.03.2, build 6a30dfc
  Helm v3.0.0-beta.3
网络信息: k8s-master x 1 / 172.31.253.28
  k8s-node01 x 1 / 172.31.253.29

解决方案

Local-machine Solutions

本地测试。简单的 K8s 测试、体验环境;

Hosted Solutions

托管解决方案。使用第三方服务,由第三方管理集群;

Turnkey – Cloud Solutions

公有云解决方案。在公有云上创建 Kubernetes 集群。云厂商提供了脚本,只需执行几个命令,这些解决方案会有社区的积极支持;

Turnkey – On-Premises Solutions

允许你使用少量命令在内部安全的云网络上创建 Kubernetes 集群。在内部搭建一个成型的环境;

比如「Agile Stacks Kubernetes Stack」提供自动化功能,可以在公共云或裸机上将 Kubernetes 部署到 VPC 中,并实现定期补丁和更新;

# Custom Solutions

-「Custom Solutions
定制解决方案为您提供最大的集群自由,但需要最多的专业知识。 这些解决方案包括不同操作系统上的裸机到云提供商;

部署流程

1、初始化环境

1.1、设置关闭防火墙及 SELINUX

1.2、关闭 Swap

1.3、设置 Docker 所需参数

1.4、安装 Docker

1.5、创建安装目录

1.6、安装及配置 CFSSL

1.7、创建认证证书

1.8、ssh-key 认证

3、部署 Flannel 网络

4、部署 master 节点:kube-apiserver/kube-scheduler/kube-controller-manager

2 、部署 ETCD

将二进制文件解压拷贝到 master 节点

部署 kube-apiserver 组件

创建 kube-apiserver systemd unit 文件

部署 kube-scheduler

部署 kube-controller-manager

5、部署 node 节点: docker/kubelet/kube-proxy

将 kubelet 二进制文件拷贝 node 节点

创建 kubelet bootstrap kubeconfig 文件

部署 kube-proxy 组件

集群状态

快速开始

注意:如下内容复制与 Kubernetes Cookbook 书籍;

1.1. Using Kubernetes Without Installation

通过一些在线的互动教程,无需安装 Kubernetes 服务,可以在线进行一些操作;

可以使用 Katacoda 提供的练习环境;

1.2. Installing the Kubernetes CLI, kubectl

安装kubectl的方法可以参考官方「Install and Set Up kubectl」手册;

验证版本:kubectl version

1.3. Installing Minikube to Run a Local Kubernetes Instance

在本地安装 Minikube 就可以进行 Kubernetes 的开发、测试、培训;

它,Minikube,利用本地的虚拟机监视器(VirtualBox,KVM)启动虚拟机,并在单一节点上运行 Kubernetes;

安装参考「Install Minikube」手册;

常用操作:

#!/bin/sh

################################################################################
# 查看版本:
################################################################################
minikube version

################################################################################
# 启动服务:
################################################################################
minikube start

# 以指定的驱动启动
minikube start --vm-driver kvm2
# ### 以 kvm 驱动启动 minikube 时,提示:目前不推荐使用 kvm 驱动,该驱动未来会被移除 ###
# !   The kvm driver is deprecated and support for it will be removed in a future release.
#                                 Please consider switching to the kvm2 driver, which is intended to replace the kvm driver.
#                                 See https://github.com/kubernetes/minikube/blob/master/docs/drivers.md#kvm2-driver for more information.
#                                 To disable this message, run [minikube config set WantShowDriverDeprecationNotification false]
#
# ### 使用 kvm2 驱动启动时,提示:需要安装 docker-machine-driver-kvm2 程序 ###
# !   Unable to start VM
# X   Error:         [KVM2_NOT_FOUND] new host: Driver "kvm2" not found. Do you have the plugin binary "docker-machine-driver-kvm2" accessible in your PATH?
# i   Advice:        Please install the minikube kvm2 VM driver, or select an alternative --vm-driver
# -   Documentation: https://github.com/kubernetes/minikube/blob/master/docs/drivers.md#kvm2-driver
#
# ### 然后启动的时候,它又会去 k8s.gcr.io 上拉取资源 ###
# 我跳过了…………因为台浪费时间了,还要再处理网络的问题。因此我不再使用 minikube 进行实验;
# 继续进行,如果有遇到使用 minikube 的必要,再回来处理这些问题;

################################################################################
# 启动 minikube 后,就可以使用 kubectl 访问该环境,这是自动的:
################################################################################
kubectl get nodes

1.4. Using Minikube Locally for Development

Minikube 提供了一些实用的命令及相关的文档,比如 start\status\stop\version\ip\ssh\dashborad\docker-env 等等;

!!!Minikube 通过运行 Docker 引擎启动容器。为了本地的 Docker 客户端在本地计算机上访问 Minikube 内部的 Docker 引擎,需要使用 minkube 的 docker-env 设置正确的环境变量;

停止虚拟机:minikube stop

指定资源:minikube start –cpus=4 –memory=4000 –kubernetes-version=v1.7.2

如果要调试 Minikube 内部的虚拟机,先使用 minikube ip 查看 IP 地址,然后使用 minikube ssh 连接。使用 minikube dashboard 命令在默认的浏览器中启动 kubeernetes 的仪表盘;

如果 Minikube 出现问题,可以使用 minikube stop 和 minikube delete 删除当前的 Minikube,然后使用 minikube start 命令重新安装;

1.5. Starting Your First Application on Minikube

在 Minikube 中运行一个程序。启动一个微型博客平台:

# kubectl run ghost –image=ghost:0.9 # 生成器,快速创建 Deployment

# kubectl expose deployments ghost –port=2368 –type=NodePort # 快速创建 Service,提供路由服务,把流量分配到部署时的启动器上;

# kubectl get pods # 查看 POD 的信息

# minikube service ghost # 浏览器访问

1.6. Accessing the Dashboard in Minikube

使用 minikube dashboard 启动仪表盘,右上角+ CREATE 创建应用,单击 DEPLOY 来部署应用,新的页面会看到一些信息;

查看服务信息:kubectl get pods,rs,deployments
查看服务日志:kubectl logs redis-3213426575-4x88v

参考文献

kubernetes/Setup
CentOS 使用二进制部署 Kubernetes 1.13 集群