Kubernetes

主要内容
Kubernetes 架构
Kubernetes 集群搭建
Kubernetes 基础概念
Kubernetes 部署容器化应用
DashBoard 工具
Ingress
Helm
Kubernetes 搭建高可用集群
Kubernetes 部署微服务项目

一、 Kubernetes 介绍

1 Kubernetes 的产生

Kubernetes 是一个开源的容器编排管理工具。

容器编排工具:
最开始我们使用物理机部署项目,但物理机成本较高。

为了节约成本,且能实现应用之间的资源隔离,我们可以使用虚拟机在操作系统中模拟出多台子电脑,每台虚拟机运行单个应用。但是虚拟机启动慢,占用空间大,必须安装完整的操作系统,非常浪费资源。

于是,容器化技术应运而生,它不需要虚拟出整个操作系统,只需要虚拟一个小规模的环境即可。容器的启动速度很快,基本不消耗额外的系统资源。Docker 是应用最为广泛的容器技术。

但是随着微服务技术的广泛应用,部署项目容器的数量越来越多,由此衍生了管理容器的重大问题。Google 在 2014 年开源了容器编排引擎 Kubernetes,用于管理容器化应用程序的部署、规划、和扩展,使我们应用的部署和运维更加方便。

2 Kubernetes 简介


Kubernetes 来自于希腊语,含义是舵手 或 领航员,简称 k8s。

k8s 是采用 Go 语言开发的,Go 语言是谷歌 2009 发布的一款开源编程语言。

k8s 的前身是 Google 的 Borg 系统,2014 年 6 月由 Google 公司正式公布开源该系统,并命名为 Kubernetes,后来 Google 将 k8s 捐给了 CNCF(云原生计算基金会)。

其他容器编排管理工具:Docker swarm、Apache Mesos等。

3 Kubernetes 的架构


k8s 集群由 Master 节点和 Node 节点组成。

Master 节点
Master 节点是集群控制节点,管理和控制整个集群。基本上 k8s 的所有控制命令都发给它,它负责具体的执行过程。在 Master 上主要运行着:

apiserver:提供了集群管理的接口及模块之间的数据交互和通信的枢纽。
etcd:保存整个集群的状态。
controllers:自动化控制中心,负责维护管理集群状态,如:故障检测,自动扩展,滚动更新等。
scheduler: 负责资源调度,按照预定的调度策略将 Pod 调度到相应的机器上。

Node 节点
除了 master 以外的节点被称为 Node 节点,每个 Node 都会被 Master 分配一些工作负载(Docker 容器),当某个 Node 宕机时,该节点上的工作负载就会被 Master 自动转
移到其它节点上。在 Node 上主要运行着:

kube-proxy:实现 service 的通信与负载均衡。
kubelet:用来处理 Master 节点下发到本节点的任务,管理 Pod 和其中的容器。
container runtime:运行容器所需要的一系列程序。

二、 Kubernetes 环境搭建

1 Kubernetes 环境搭建方式

搭建 Kubernetes 集群有多种方式:二进制包、kubeadm、第三方工具、云平台一键安装等方式都可以,这里我们采用 kubeadm 搭建 Kubernetes 集群。

kubeadm 是官方社区推出的一个用于快速部署kubernetes 集群的工具,这个工具能通过两条指令完成一个 kubernetes 集群的部署:

创建 Master 节点:
kubeadm init将 Node 节点加入到 Master 节点中
kubeadm join <Master 节点的 IP 和端口>

2 Kubernetes 部署环境要求

  • 操作系统 CentOS7 以上
  • 硬件配置:内存 2G 以上,CPU 2 核以上
  • 集群内各个机器之间能相互通信,可以访问外网
  • 禁止 swap 分区
    swap 分区:即硬盘交换区,当内存不够用时,可以临时使用硬盘中的这部分空间。

3 Kubernetes 集群搭建

3.1 创建三台 Linux 虚拟机

创建三台 Linux 虚拟机,一台作为 Master 节点,两台作为 Node 节点。
每台系统为 CentOS7,CPU 双核,内存 2G,硬盘100G,网络选择桥接模式。
安装好后使用 SSH 工具(如 XShell)连接虚拟机,方便操作。


3.2 Kubernetes 部署环境准备

提示:设置三个节点同时运行一条命令的方法:


回车即可同时执行该命令。

关闭防火墙
systemctl stop firewalld
systemctl disable firewalld关闭 selinux
selinux:linux 的安全系统
sed -i 's/enforcing/disabled/' /etc/selinux/config关闭 swap
sed -ri 's/.*swap.*/#&/' /etc/fsta设置网桥参数
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF时间同步
yum install ntpdate -y
ntpdate time.windows.com在 master 节点为各主机的 IP 命名
cat >> /etc/hosts << EOF
192.168.1.42 master
192.168.1.43 node1
192.168.1.44 node2
EOF



设置完成后重启虚拟机使修改生效

3.3 Kubernetes 安装

Kubernetes 的每个节点都需要安装 Docker、kubeadm、kubelet、kubectl

Docker:Kubernetes 默认容器运行环境是 Docker,因此首先需要安装 Docker

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

Kubeadm:用于构建 k8s 集群

Kubelet:负责启动 POD 和容器

3.3.1 安装 Docker

安装必要的一些系统工具
sudo yum install -y yum-utils device-mapper-persistent-data配置清华大学的 yum 源镜像,加快下载速度
sudo yum-config-manager \
--addrepo\
https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo安装 Docker
yum -y install docker-ce如果 yum 下载过程中断开,造成 yum 程序锁定,可运行以下命令关闭 yum 程序
rm -f /var/run/yum.pidDocker 配置加速器加速镜像下载
mkdir -p /etc/docker
touch /etc/docker/daemon.json
cat >> /etc/docker/daemon.json << EOF
{ "registry-mirrors": ["https://registry.docker-cn.com"]
}
EOF自动运行 docker 服务
systemctl enable docker.service

配置清华大学的 yum 源镜像,加快下载速度

Docker 配置加速器加速镜像下载

3.3.2 安装 kubeadm,kubelet 和 kubectl

配置 yum 源镜像
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF安装软件
yum install kubelet-1.19.4 kubeadm-1.19.4 kubectl-1.19.4 -y自动运行软件
systemctl enable kubelet.service查看是否安装成功
yum list installed | grep kubelet
yum list installed | grep kubeadm
yum list installed | grep kubectl

配置 yum 源镜像

安装软件后重启虚拟机

3.4 Kubernates 部署节点

3.4.1 部署 Master 节点

在 master 节点执行:

部署 master 节点
kubeadm init \
--apiserver-advertise-address=192.168.1.42 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.19.4 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16service-cidr 的选取不能和 pod-cidr 及本机网络有重叠或者冲突,一般可以选择一个
本机网络和 pod-cidr 都没有用到的私网地址段,比如 pod-cidr 使用 10.244.0.0/16, 那么
service-cidr 可以选择 10.96.0.0/12,网络无重叠冲突即可;执行命令
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 nodes

部署 master 节点


查看节点

3.4.2 部署 Node 节点

在 Node 节点执行:

kubeadm join 192.168.1.42:6443 --token 3tfwx8.6jaaz2sijeo1rs4s \
--discovery-token-ca-cert-hash sha256:9c0fbb973d0b891fdb2b3e2bf21148f0f59a2edaf880784b7ad9ddffbcba3904

分别在node1,node2上执行该命令

3.4.3 安装网络插件

安装网络插件才能够让 Master 和 Node 节点可以通信,需要在 master 节点执行:

使用 rz 上传 kube-flannel.yml 文件应用 kube-flannel.yml 文件得到运行时容器
kubectl apply -f kube-flannel.yml等一会儿后查看节点状态
kubectl get nodes

3.4.4 修改节点名

在 node 节点执行

修改主机名
hostnamectl set-hostname node1重置 node 节点
kubeadm reset重新添加到 master 节点
kubeadm join 192.168.1.42:6443 --token 3tfwx8.6jaaz2sijeo1rs4s \
--discovery-token-ca-cert-hash sha256:9c0fbb973d0b891fdb2b3e2bf21148f0f59a2edaf880784b7ad9ddffbcba3904

在 master 节点执行

删除节点
kubectl delete node 节点名

修改主机名


关闭节点重新连接

重置 node 节点

重新添加到 master 节点

以上操作分别在node1,node2上执行

再次查看

删除多余的节点

至此我们的 k8s 环境就搭建好了

三、 Kubernetes 基础概念

1 Pod

在 Kubernetes 集群中,Pod 是 k8s 管理的最小单位级,它是一个或多个容器的组合。

在 Pod 中,所有容器都被统一安排和调度。

Pod 中的容器有两个特点。

共享网络:Pod 中的所有容器共享同一个网络命名空间,包括 IP 地址和网络端口。
共享存储:Pod 中的所有容器能够访问共享存储卷,允许这些容器共享数据。

2 控制器

k8s 通过控制器管理和调度 Pod。k8s 有以下几种控制器:

  • ReplicationController/ReplicaSet
    RC 能够确保容器的副本数始终保持用户定义的副本数。即如果有容器异常退出,会自动创建新的 Pod 来替代,而由于异常多出来的容器也会自动回收。RS 跟 RC 没有
    本质不同,新版本的 k8s 建议使用 ReplicaSet 取代 ReplicationController。
    虽然 RS 可以独立使用,但一般还是建议使用 Deployment 自动管理 RS。
  • Deployment
    Deployment 为 Pod 和 RS 提供了声明式定义方式管理应用,用来替代 RS 命令式定义方式管理应用。且Deployment 提供了很多 RS 不支持的机制,比如滚动升级和回滚应用。
    命令式:侧重于如何实现程序,就像我们刚接触编程的时候那样,我们需要把程序
    的实现过程按照逻辑结果一步步写下来。
    声明式:侧重于定义想要什么,然后告诉计算机,让它帮你去实现。
  • DaemonSet
    DaemonSet 确保 Node 上只运行一个 Pod。当有 Node 加入集群时,会为集群新增一个 Pod。当有 Node 从集群移除时,这些 Pod 也会被回收。
  • Job
    Job 负责批处理任务,即仅执行一次的任务,它保证批处理任务的一个或多个 Pod成功结束。比如运行一次 SQL 脚本。
  • Cron job
    负责执行定时任务,即在给定时间点执行一次或周期性地在给定时间点执行任务。

3 Service

Service 可以管理多个 Pod 作为一个整体被外部访问。在 k8s 中有以下四种类型的Service。

  • ClusterIP
    默认类型,自动分配一个仅集群内部可以访问的虚拟 IP。
  • NodePort
    在 ClusterlP 基础上为 Service 绑定一个端口,可以通过该端口访问服务。
  • LoadBalancer
    在 NodePort 的基础上创建一个负载均衡器,并将请求转发到 NodePort。
  • ExternalName
    把集群外部的服务引入到集群内部,在集群内部直接使用。

四、 Kubernates 部署容器化应用

容器化应用:把一个应用程序放在 docker 里部署,这个 docker 应用就是容器化应用,在 docker 中我们通过启动镜像部署容器化应用。
如何在 k8s 中部署容器化应用:

  1. 获取镜像:编写 Dockerfile 制作镜像,或者从仓库拉取镜像
  2. 控制器创建 pod:控制器启动镜像,创建容器并将容器放入 pod 中
  3. 暴露应用,使外界可以访问应用

1 在 Kubernetes 集群中部署 Nginx

  1. 从仓库拉取镜像,创建 pod
kubectl create deployment nginx --image=nginx


2. 创建 service 暴露 pod端口

kubectl expose deployment nginx \
--port=80 \
--target-port=80 \
--type=NodePort


3. 访问应用,地址为:http://NodeIP:NodePort

4. 补充查看/删除命令:

查看节点
kubectl get node查看 service
kubectl get service查看控制器:
kubectl get deployment (deploy)查看pod
kubectl get pod删除 service
kubectl delete service 服务名删除控制器
kubectl delete deployment 控制器名删除 pod
kubectl delete pod pod名

2 在 Kubernetes 集群中部署 Tomcat

从仓库拉取镜像,创建 pod
kubectl create deployment tomcat --image=tomcat创建 service 暴露 pod 端口
kubectl expose deployment tomcat \
--port=8080 \
--type=NodePort访问 tomcat:http://NodeIP:NodePort


3 在 Kubernetes 集群中部署 SpringBoot 项目

3.1 构建 JDK 镜像

使用 rz 上传 JDK 压缩文件制作 DockerFile
cat <<EOF > Dockerfile
# 基于 centos7,如果没有这个镜像那么它会下载这个镜像。
FROM centos:7
# 创建者
MAINTAINER hy
# 复制文件到指定目录并自动解压
ADD jdk-8u144-linux-x64.tar.gz /usr/local/jdk
# 设置环境变量
ENV JAVA_HOME=/usr/local/jdk/jdk1.8.0_144
ENV CLASSPATH=.:$JAVA_HOME/lib
ENV PATH=$JAVA_HOME/bin:$PATH:/usr/local/jdk/jdk1.8.0_144/bin
EOF构建 JDK 镜像
docker build -t='jdk1.8'. 查看所有的镜像,此时就多了一个 jdk1.8
docker images创建容器
docker run -di --name=jdk1.8 jdk1.8 /bin/bash进入容器
docker exec -it jdk1.8 /bin/bash

制作 DockerFile

构建 JDK 镜像

3.2 构建项目镜像

使用 maven 将项目打成 jar 包,使用 rz 上传到虚拟机中制作 DockerFile
cat <<EOF > Dockerfile
FROM jdk1.8
MAINTAINER hy
ADD springboot-k8s-1.0.0.jar /opt
RUN chmod +x /opt/springboot-k8s-1.0.0.jar
CMD java -jar /opt/springboot-k8s-1.0.0.jar
EOF构建项目镜像:
docker build -t springboot-k8s-1.0.0.jar . 使用镜像启动容器:
docker run -d -p 8085:8080 springboot-k8s-1.0.0.jar

制作 DockerFile

构建项目镜像:

使用镜像启动容器:

3.3 上传镜像

我们将项目上传镜像到 Docker Hub,方便项目部署

  1. 注册登录 DockerHub 网站
  2. 在 DockerHub 创建镜像仓库
  3. 在 master 节点登录 DockerHub
docker login
  1. 将本地镜像修改为规范的镜像名称:
docker tag docker 镜像名 注册用户名/仓库名
  1. 上传镜像
docker push 注册用户名/仓库名

3.4 部署项目

命令行部署项目

kubectl create deployment springboot-k8s --image=注册用户名/仓库名



yml 文件部署项目
yml 文件是 k8s 的资源清单文件,我们可以通过 yml 文件精确修改构建参数。

  1. 空运行测试,空运行测试没有真正运行项目,而是生成项目运行的 yml 配置文件。
kubectl create deployment springboot-k8s \
--image=461618768/springboot-k8s \
--dry-run \
--output yaml > deploy.yml




2. 修改 yml 文件,把镜像拉取策略改为 IfNotPresent,即如果本地有镜像就使用本地镜像,没有就拉取在线镜像。

containers: - image: springboot-k8sname: springboot-k8s-1-0-0-jar-8ntrximagePullPolicy: IfNotPresent



3. 使用 yml 文件构建 deployment

kubectl apply -f deploy.yml


补充:yml 常用字段含义

3.5 暴露服务端口

kubectl expose deployment springboot-k8s --port=8080 --type=NodePort

3.6 访问项目

http://NodeIP:NodePort/资源路径

五、 DashBoard

1 概念

DashBoard 是 k8s 的可视化管理工具,可以基于 web 对 k8s 集群进行集中管理。

2 安装

DashBoard 的安装是将 DashBoard 作为一个容器部署在 k8s中。

下载 yml 资源清单
wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.4/aio/deploy/recommended.yaml

下载后我们需要修改清单文件,暴露端口

注释以下内容:

应用 yml 的资源清单,安装 DashBoard
kubectl apply -f recommended.yaml查看安装是否成功,注意 DashBoard 安装到了 kubernetes-dashboard 命名空间下面
kubectl get pod -n  kubernetes-dashboard浏览器访问 https://ip:暴露端口
此时需要输入 token,token 的生成采用以下固定命令:
# kubectl create serviceaccount dashboard-admin -n kube-system
# kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin - serviceaccount=kube-system:dashboard-admin
# kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}')

上传 yaml 文件


查看安装是否成功

补充:
namespace:命名空间,为了在多租户情况下,实现资源隔离,之前使用的是 default命名空间。比如一套 k8s 集群可以针对开发环境和测试环境进行两套互不影响的部署,属于逻辑性隔离,可以针对 namespace 做资源配额。

浏览器访问

token 的生成采用以下固定命令:

复制生成的密钥

登录即可

六、 Ingress

1 NodePort 的三个端口

查看 service 的资源清单

kubectl get service 服务名 -o yaml

资源清单中有三个端口:

  • nodePort:外部访问的端口
  • port:集群内部通信的端口
  • targetPort:容器中服务的端口

2 Ingress 的优点

NodePort 方式最大的缺点是每个 service 都要暴露端口,在部署微服务时会暴露大量端口加大管理难度,所以在生产环境中不推荐使用这种方式来直接发布服务。

使用 LoadBalancer 暴露服务可以解决端口过多的问题,但 LoadBlancer 需要向云平台申请负载均衡器,与云平台的耦合度太高,相当于购买了服务。

而 Ingress 相当于是服务网关,可以通过 URL 路径代理 service,只需要暴露一个端口就可以满足所有 service 对外服务的需求,生产环境建议使用这种方式。

3 安装 Ingress

Ingress不是k8s的内置软件,需要单独安装,k8s官方使用 Ingress Nginx 实现Ingress功能。

2.1 部署 Ingress Nginx

下载 Ingress Nginx 资源清单文件:
wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v0.41.2/deploy/static/provider/baremetal/deploy.yaml下载后我们需要修改清单文件修改镜像地址为:
registry.cn-hangzhou.aliyuncs.com/google_containers/nginx-ingress-controller:0.33.0

为了能够正常访问 Ingress,还需要添加如下配置:

运行资源清单,安装 Ingress Nginx
kubectl apply -f ingress-deploy.yaml安装是否成功
kubectl get pod -n ingress-nginx

2.2 创建 Ingress 规则

删除相关配置:
kubectl delete -A ValidatingWebhookConfiguration ingress-nginx-admission执行资源清单配置 Ingress 规则:
kubectl apply -f ingress-nginx-rule.yaml查看 Ingress 规则:
kubectl get ingres

ingress-nginx-rule.yaml

2.3 测试

由于 Ingress 暴露的是一个网址而不是 IP 地址,但服务并未发布到外网,所以测试计算机要将网址和 IP 地址做映射。

打开 C:\Windows\System32\drivers\etc\hosts,添加:
192.168.2.94 baizhan.abc

七、 Helm

1 概念

k8s 上的 deployment、service 等应用对象,都是由资源清单部署的。对于一个复杂的应用,会有很多类似的资源清单文件。例如微服务架构应用,组成应用的服务可能多达几十个。如果有更新或回滚应用的需求,可能要修改维护大量 yml 文件。

Helm 是一个 k8s 的应用管理工具,可以很方便的通过管理 yaml 文件来部署应用,更新应用版本。目前 Heml 的 V3 版本发布,极大简化了之前繁琐的使用方式。

Helm 中有 3 个重要概念:

  • helm:命令行客户端工具,能够进行 chart 的创建,项目打包、发布和管理。
  • chart:应用描述,一系列用于描述 k8s 资源相关文件的集合。
  • release:基于 chart 部署的资源,chart 被 helm 运行后将会生成对应release。

2 安装

使用 rz 将 helm 上传到 linux
tar zxvf helm-v3.0.0-linux-amd64.tar.gz解压后移动到/usr/bin 目录下
mv linux-amd64/helm /usr/bin/

3 远程仓库中的 chart 安装 release

配置国内 chart 仓库
helm repo add stable http://mirror.azure.cn/kubernetes/charts
helm repo add aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
helm repo update查找 chart
helm search repo weave查看 chart 具体信息
helm show chart stable/mysql安装 release
helm install 应用名 仓库名
(helm install ui stable/weave-scope)查看所有 release
helm list查看发布状态
helm status 应用名卸载 release
helm uninstall 应用名

配置国内 chart 仓库

4 自定义 chart 安装 release

构建 Chart
helm create mychart进入构建好的 Chart
cd mychart/进入 template 文件夹
cd template/删除文件夹内所有自带文件
rm -rf *生成 deployment 和 service 的 yml 文件
kubectl create deployment springboot-k8s --image=461618768/springboot-k8s --dry-run --output yaml > deployment.yaml
kubectl expose deployment springboot-k8s --port=8080 --type=NodePort --dry-run -o yaml > service.yaml退出到上一级目录
cd .. 部署 release
helm install springboot-k8s.应用升级
helm upgrade springboot-k8s.

5 使用 chart 模板安装 release

部署微服务项目时需要大量的 chart,但这些配置文件大部分参数一样,只有少部分不同,helm 提供了模板+自定义数据的方式,简化配置文件的编写和管理。

修改 values.yaml,添加需要配置的数据,如:
image: 461618768/springboot-k8s
serviceport: 8080
targetport: 8080
label: springboot-k8s进入 template,修改 deployment.yaml 和 service.yaml,在需要配置数据的地方使用{{ .Values.参数名}},如:
metadata:
labels:
app: {{ .Values.label }}
name: {{ .Values.label }}退出 template 目录
cd .. 查看模板渲染过的资源文件
helm install springboot-k8s --dry-run .部署 release
helm install springboot-k8s.

修改 values.yaml


进入 template,修改 deployment.yaml 和 service.yaml



八、 搭建高可用集群

Master 节点扮演着总控中心的角色。如果 Master 节点故障,将无法进行任何集群管理。搭建高可用集群即在集群中搭建多个 master 节点,保证集群的安全性和稳定性。

高可用集群架构图:

高可用集群技术图:

1 安装一台 master 节点虚拟机

安装一台 k8s 环境的 master 节点,安装后设置该虚拟机的主机名
hostnamectl set-hostname master2

2 Master 节点安装 keepalived

在每台 master 节点做如下操作

安装相关包和 keepalived
yum install -y conntrack-tools libseccomp libtool-ltdl
yum install -y keepalived配置 keepalived
cat > /etc/keepalived/keepalived.conf <<EOF
! Configuration File for keepalived
global_defs {router_id k8s
}
vrrp_script check_haproxy {script "killall -0 haproxy"interval 3weight -2fall 10rise 2
}
vrrp_instance VI_1 {state MASTERinterface ens33virtual_router_id 51priority 250advert_int 1authentication {auth_type PASSauth_pass ceb1b3ec013d66163d6ab
}
virtual_ipaddress {192.168.1.50
}
track_script {check_haproxy}
}
EOF
注意 vip 和网卡名不要配错设置自动启动 keepalive
systemctl start keepalived.service
systemctl enable keepalived.service
systemctl status keepalived.service查看生成的 vip
ip a s ens33

3 Master 节点安装 haproxy

在每台 master 节点做如下操作:

安装 haproxy
yum install -y haproxy配置 haproxy
cat > /etc/haproxy/haproxy.cfg << EOF
#---------------------------------------------------------------------
# Global settings
#---------------------------------------------------------------------
globallog       127.0.0.1 local2chroot      /var/lib/haproxypidfile     /var/run/haproxy.pidmaxconn     4000user        haproxygroup        haproxydaemonstats socket /var/lib/haproxy/stats
defaultsmode                httplog                 globaloption                httplogoption               dontlognulloption http-server-closeoption forwardfor    except 127.0.0.0/8option                redispatchretries           3timeout http-request 10stimeout queue      1mtimeout connect   10stimeout client       1mtimeout server        1mtimeout http-keep-alive 10stimeout check      10smaxconn          3000
#---------------------------------------------------------------------
# kubernetes apiserver frontend which proxys to the backends
#---------------------------------------------------------------------
frontend kubernetes-apiservermode               tcpbind                 *:16443option               tcplogdefault_backend   kubernetes-apiserver
#---------------------------------------------------------------------
# round robin balancing between the various backends
#---------------------------------------------------------------------
backend kubernetes-apiservermode        tcpbalance  roundrobinserver        master 192.168.1.42:6443 checkserver        master2 192.168.1.47:6443 check
#---------------------------------------------------------------------
# collection haproxy statistics message
#---------------------------------------------------------------------
listen statsbind            *:1080stats auth        admin:awesomePasswordstats refresh  5sstats realm   HAProxy\ Statisticsstats uri        /admin?stats
EOF配置中声明了代理的两个 master 节点服务器,指定了 haproxy 运行的端口为 16443,
因此 16443 端口为集群的入口设置自动启动
systemctl start haproxy
systemctl enable haprox查看安装状态
systemctl status haproxy

4 重新部署 Master1 节点

在 master1 节点操作

重置 master1 节点
kubeadm reset使用配置文件创建 master 节点
cat <<EOF > kubeadm-config.yaml
apiServer:
certSANs:
- master
- master2
- k8s-vip
- 192.168.1.42
- 192.168.1.47
- 192.168.1.50
- 127.0.0.1
extraArgs:authorization-mode: Node,RBACtimeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta1
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controlPlaneEndpoint: "192.168.1.50:16443" controllerManager: {}
dns:type: CoreDNS
etcd:local:dataDir: /var/lib/etcd
imageRepository: registry.aliyuncs.com/google_containers
kind: ClusterConfiguration
kubernetesVersion: v1.19.4
networking:dnsDomain: cluster.localpodSubnet: 10.244.0.0/16serviceSubnet: 10.1.0.0/16
scheduler: {}
EOF执行配置文件
kubeadm init --config kubeadm-config.yaml按照提示配置环境变量
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

5 将 Master2 节点加入 k8s集群中

将 master1 的密钥及相关文件复制到 master2
在 master1 执行:
ssh root@192.168.1.47 mkdir -p /etc/kubernetes/pki/etcd
scp /etc/kubernetes/admin.conf root@192.168.1.47:/etc/kubernetes
scp /etc/kubernetes/pki/{ca.*,sa.*,front-proxy-ca.*} root@192.168.1.47:/etc/kubernetes/pki
scp /etc/kubernetes/pki/etcd/ca.* root@192.168.1.47:/etc/kubernetes/pki/etcdmaster2 加入集群
kubeadm join master.k8s.io:16443 --token ckf7bs.30576l0okocepg8b
--discovery-token-ca-cert-hash sha256:19afac8b11182f61073e254fb57b9f19ab4d798b70501036fc69ebef46094aba
--control-plane--control-plane 表示把 master 控制节点加入集群配置环境变量
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

在 master1 执行:



master2 加入集群【复制自己生成的token】

配置环境变量

6 将 node 节点加入 k8s 集群

在 node 执行:
kubeadm join 192.168.1.50:16443 --token 9ov3pl.3mgb1d372ag2haq3 \
--discovery-token-ca-cert-hash sha256:9887fb98fc8d9c368926c558be0b706b3ff5b94162432bbfbeee05f128bc67c0

如果安装失败,出现如下提示:

原因是 node 节点禁止 ip 转发,需要进行如下操作:
查看是否打开 IP 转发,0 代表禁止,1 代表转发
less /proc/sys/net/ipv4/ip_forward如果为 0,需要更改文件的内容
echo "1" > /proc/sys/net/ipv4/ip_forward重启网络服务
service network restart重启虚拟机,重新加入 k8s 集群

九、 k8s 部署微服务项目

1 准备微服务项目和 k8s 集群

我们准备一个微服务项目 demo,该项目只有一个功能:借阅图书。项目包括 eureka注册中心,gateway 网关,用户服务,会员服务。借阅图书调用图书服务的方法,该方法内会使用 Feign 调用会员服务的方法验证是否存在该会员。
我们要将该项目部署到 k8s 集群中,该集群包含两个 master 节点,两个 node 节点。

2 部署 Eureka 注册中心

2.1 制作镜像

将注册中心打成 jar 包,使用 rz 上传到 master 节点中。
写 DockerFile
cat <<EOF > Dockerfile
FROM jdk1.8
MAINTAINER hy
ADD lib_registry-1.0.0.jar /opt
RUN chmod +x /opt/lib_registry-1.0.0.jar
CMD java -jar /opt/lib_registry-1.0.0.jar
EOF制作 docker 镜像:
docker build -t lib_registry-1.0.0.jar.

2.2 上传镜像

登录 Docker Hub
docker login
创建镜像仓库,命名为 lib-register将本地镜像修改为规范的镜像名称:
docker tag lib_registry-1.0.0.jar 461618768/lib-registry上传镜像:
docker push 461618768/lib-registry

2.3 部署项目

kubectl create deployment lib-registry --image=461618768/lib-registry

2.4 暴露服务

给 Eureka 创建服务
cat <<EOF > eureka-server.yml
apiVersion: v1
kind: Service
metadata:name: lib-registrylabels:app: lib-registry
spec:ports: - port: 9007targetPort: 8761nodePort: 31234name: lib-registrytype: NodePortselector:app: lib-registry
EOF执行资源清单
kubectl create -f eureka-server.yml

3 部署网关、book 服务、Member 服务

3.1 每个微服务的 application.yml 要做如下配置


这样才能正常连接注册中心

3.2 制作镜像

将三个微服务打成 jar 包,使用 rz 上传到 master 节点中,之后分别构建镜像:

制作 gateway 镜像:
cat <<EOF > Dockerfile
FROM jdk1.8
MAINTAINER hy
ADD lib_gateway-1.0.0.jar /opt
RUN chmod +x /opt/lib_gateway-1.0.0.jar
CMD java -jar /opt/lib_gateway-1.0.0.jar
EOFdocker build -t lib_gateway-1.0.0.jar . 制作 member 镜像:
cat <<EOF > Dockerfile
FROM jdk1.8
MAINTAINER hy
ADD lib_member-1.0.0.jar /opt
RUN chmod +x /opt/lib_member-1.0.0.jar
CMD java -jar /opt/lib_member-1.0.0.jar
EOFdocker build -t lib_member-1.0.0.jar .制作 book 镜像:
cat <<EOF > Dockerfile
FROM jdk1.8
MAINTAINER hy
ADD lib_book-1.0.0.jar /opt
RUN chmod +x /opt/lib_book-1.0.0.jar
CMD java -jar /opt/lib_book-1.0.0.jar
EOFdocker build -t lib_book-1.0.0.jar . 查看是否制作成功:
docker images

3.3 上传镜像

创建三个镜像仓库,命名为 lib-member、lib-book、lib-gateway、lib-registry将本地镜像修改为规范的镜像名称:
docker tag lib_gateway-1.0.0.jar 461618768/lib-gateway
docker tag lib_member-1.0.0.jar 461618768/lib-member
docker tag lib_book-1.0.0.jar 461618768/lib-book上传镜像:
docker push 461618768/lib-gateway
docker push 461618768/lib-member
docker push 461618768/lib-book

3.4 部署项目

kubectl create deployment lib-gateway --image=461618768/lib-gateway
kubectl create deployment lib-member --image=461618768/lib-member
kubectl create deployment lib-book --image=461618768/lib-book


3.5 Ingress 暴露网关

创建网关的 Service
kubectl expose deployment lib-gateway --port=80 --type=ClusterIP修改 Ingress 规则文件
vim ingress-nginx-rule.yaml执行资源清单配置 Ingress 规则:
kubectl apply -f ingress-nginx-rule.yaml测试 Ingress
打开测试计算机的 C:\Windows\System32\drivers\etc\hosts,添加:
192.168.1.44 baizhan.lib访问:http://baizhan.lib/book/takeBook?bookId=1&telPhone=13888888888

修改 Ingress 规则文件

4 注意

k8s 主要是针对无状态应用设计的,所以一般情况下我们不在 K8S 中部署有状态应用,如 mysql、Eureka 等。

无状态应用:是指应用不会在会话中保存下次会话所需要的客户端数据。每一个会话都像首次执行一样,不会依赖之前的数据进行响应。如 WEB 服务器。

有状态应用:是指应用会在会话中保存客户端的数据,并在客户端下一次的请求中来使用那些数据。如数据库、Eureka 注册中心。

案例中我们部署了 Eureka,但实际运维过程中一般不会将其放入 k8s 集群。

Spring Cloud Alibaba技术栈

容器化技术【Kubernetes】相关推荐

  1. 容器化技术(十一):Kubernetes中Pod的调度策略-标签与污点实战

    一.Pod的调度策略总述 Kubernetes中的容器编排功能的最大需要解决的问题就是将创建的Pod,调度到Node上去.那么Pod在选择调度到哪个Node上去时,是如何决策的.这就涉及到了我们在前面 ...

  2. 容器化技术(三):Docker的运转流程

    Docker的本质是容器运行时,它是CS架构的,也就是我们通过客户端可以操作Docker服务端. 为了方便大家理解,我们不上来就讲解Docker内部的底层运作原理,我们先从Docker的运转流程开始, ...

  3. 深度解析容器化技术在广发证券交易系统的应用

    作者简介:杨涛,广发证券交易云技术研发团队负责人,资深架构师,在证券行业有超过9年的工作经验.目前致力于广发证券OpenTrading证券交易云核心技术研发. 责编:魏伟,本文转载自<程序员&g ...

  4. tcpip路由技术卷一_减少与开发的撕战,结合容器化技术轻松重构运维平台

    荔枝微服务化进程较早,目前已有上千个服务模块,先前的运维平台渐渐无法满足微服务架构下运维管理的需求,于是决定从2018年开始重构运维平台,结合容器化技术,让开发人员尽可能无感知迁移的同时享受容器化带来 ...

  5. 容器化技术如何在数据中心实践

    容器化技术是大势所趋,容器云将凭借快速部署.便捷运维等特性在物联网.边缘计算等行业中大放异彩. 主讲人|又拍云首席布道师 运维总监 邵海杨 自从虚拟化技术和云计算服务出现以来,IT公司都将虚拟机作为降 ...

  6. 容器编排技术 -- Kubernetes从零开始搭建自定义集群

    容器编排技术 -- Kubernetes从零开始搭建自定义集群 1 设计和准备 1.1 学习 1.2 Cloud Provider 1.3 节点 1.4 网络 1.4.1 网络连接 1.4.2 网络策 ...

  7. 容器编排技术 -- Kubernetes是什么

    容器编排技术 -- Kubernetes是什么 1 Kubernetes是什么? 1.1 Kubernetes 特点 2 Why containers? 2.1 使用Kubernetes能做什么? 2 ...

  8. 容器编排技术 -- Kubernetes 架构

    容器编排技术 -- Kubernetes 架构 1 Borg简介 2 Kubernetes架构 2.1 分层架构 Kubernetes最初源于谷歌内部的Borg,提供了面向应用的容器集群部署和管理系统 ...

  9. 容器编排技术 -- Kubernetes 设计理念

    容器编排技术 -- Kubernetes 设计理念 1 Kubernetes 设计理念 1.1 Kubernetes设计理念与分布式系统 1.2 API设计原则 1.3 控制机制设计原则 2 Kube ...

最新文章

  1. 第十一周项目实践4 BFS(广度优先搜索)基本模板
  2. [YTU]_2018 ( 约瑟夫问题)
  3. js原生popup_JavaScript的popup框
  4. 怎么查看linux网关,如何查看linux服务器网关
  5. android studio类似软件,使Android Studio更高效的几款插件推荐
  6. JavaScript、Ajax、jQuery全部知识点,5分钟速懂!
  7. hp RAID卡 命令行管理
  8. Servlet四种访问属性--知识点
  9. linux两个树莓派通信,Arduino与树莓派间的通信实践
  10. 深度学习含有递进关系的数据应该如何表达_文案写作:如何构建写作框架优化表达内容?...
  11. 2021-09-07python深拷贝和浅拷贝
  12. 人脸识别python face_recognize_python人脸识别库-face_recognition详解
  13. 顺利通过2020年下工信部的系统架构设计师考试,在此感悟一下
  14. 豆瓣读书TOP250书籍信息爬虫脚本
  15. mysql职院毕业论文设计_小说网站的设计与实现(27页)-原创力文档
  16. python设置颜色_使用python改变颜色的色调
  17. 极光推送上线7周年大庆,777件礼物送给大家
  18. 爱心代码表白(可直接复制运行)
  19. unity animator动画融合时的上下半身速度分离控制
  20. 45亿换1000万学生,互联网在线教育“火烧赤壁”能否有霸主横空出世?

热门文章

  1. word参考文献交叉引用一次性更新全部域
  2. 详解one-hot编码及代码举例
  3. gazebo打开仿真环境报错gzserver: /build/ogre-1.9-mqY1wq/ogre-1.9-1.9.0+dfsg1/OgreMain/src/OgreRenderSystem
  4. 输出日期为2021年的第几天(switch...case)
  5. 揭秘“1200工程”:苏宁如何培养企业接班人? | 一点财经
  6. VUE中$refs和$el的使用
  7. Linux开机启动、bashrc、定时任务
  8. Raw use of parameterized class ‘xxxx‘ 警告
  9. 工业交换机冗余什么意思?
  10. notifyDataSetInvalidated()和notifyDataSetChanged()有什么区别