Kubeadm 升级 k8s 至 v1.17.4及运行 nginx+tomcat 并实现动静分离 | 学习笔记

简介: 快速学习 Kubeadm 升级 k8s 至 v1.17.4及运行 nginx+tomcat 并实现动静分离

开发者学堂课程【Kubernetes 入门实战演练2020版Kubeadm 升级 k8s 至 v1.17.4及运行 nginx+tomcat 并实现动静分离学习笔记,与课程紧密连接,让用户快速学习知识。

课程地址https://developer.aliyun.com/learning/course/656/detail/10862


Kubeadm 升级 k8s 至 v1.17.4及运行 nginx+tomcat 并实现动静分离


内容介绍

一.K8s 升级

二.k8snode 服务

三.测试与运行

四.kubeadm 其他命令


一.K8s 升级

1.升级条件

刚遇到版本出现 bug 或者功能不能满足业务的需求涉及到升级,以此来解决功能的不足或缺陷。

2.流程初始化

升级测试环境或开发环境,容易升级,不用管理业务或者不用考虑用户的访问。

升级生产环境时,需要选择升级时间,一般选择凌晨(因为此时访问的人较少)

升级方式:

kubeadm(较容易)

ansible(较容易)

证书签发:dec/kubernetes/pki/(可查看一些证书)

手动安装:比较复杂,考虑开发证书,牵动服务等。

3.K8s 群集升级

升级 K8s 集群必须先升级 kubeadm 版本到目的 k8s版本,也就是说 kubeadm#是k8s 升级的"准升证”。

kubeadm 命令先升到需要的 kubeadm 版本,再升级 k8s。有新的 kubeadm 才能升级k8s

"准升证”:要求严格,有新的 kubeadm 才有新的 k8s

4.升级 k8smaster 服务:

在 k8s 的所有 master 进行升级,将管理端服务 kube-controller-manager.kube-apiserver.kubeschedulerkubeproxy。

直接安装

apt-cachemadisonkubeadm:查看仓库可以装进哪些新版本

aptinstallkubeadm=1.17.4.00:把kubeadm安装成1.17.4版本

Kubeadm-version 验证版本:

此时可以通过1.17.4版本的 Kubeadm 安装1.17.4版本的 k8s。

通过 Kubeadm--help的upgrade 参数:

升级集群到新的版本

apply:升级集群到指定版本

diff:运行到不同地方,不同版本信息(不升级)

--dry-run 测试运行

Node:升级node结点

Plan:检查升级计划

给出清单:

对比当前版本:1.17.2可用版本1.17.4CoreDNS版本无变化:已升级至最新版本Kubeadmupgrade--help检查当前升级版本

5.验证当 k8s 前版本:

#kubeadmversion

Kubeadmversion:&version.Info(Major:"1",Minor"17"

GitVersion:"v1.17.3",

GitCommit:"06ad960bfd03b39c8310aaf92d1e7c12ce618213"

GitTreeState:'clean",

BuildDate:"2020-02-11T18:12:12Z",GoVersion:"g01.13.6",

Compiler:"gc",Platform:"linux/amd64"

6.各master安装指定新版本kubeadm:

#apt-cachemadisonkubeadm#查看k8s版本列表,

#apt-getinstallkubeadm=1.17.4-00#安装新版本kubeadm

#kubeadmversion#验证kubeadmversion版本

Kubeadmversion:&version.Info{Major:"1"Minor:"17",

GitVersion:"v1.17.4",

GitCommit:"8d8aa39598534325ad77120c120a22b3a990b5ea",

GitTreeState:"cean",BuildDate:"2020-03-12T21:01:11z",

GoVersion:"go1.13.8",Compiler:"gc",

Platform:"linux/amd64"}

7.Kubeadm 升级命令使用帮助

#Kubeadmupgrade--help

Upgradeyourclustersmoothlytoanewerversionwiththis

command

Usage:

kubeadmupgrade[flags]

kubeadmupgrade[command]

AvailableCommands:

apply

UpgradeyourKubernetesclustertothespecifiedversion

diff

Showwhatdifferenceswouldbeappliedtoexistingstaticpod

manifests.See

also:kubeadmupgradeapply--dry-run

NodeUpgradecommandsforanodeinthecluster

plan

Checkwhichversionsareavailabletoupgradetoandvalidate

whetheryourcurrentclusterisupgradeable.Toskipthe

internetcheck,passintheoptional[version]parameter。

8.升级计划

#Kubeadmupgradeplan#查看升级计划

9.开始升级

#kubeadmupgradeapplyv1.174#master1

#kubeadmupgradeapplyv1.17.4#master2

#kubeadmupgradeapplyv1.17.4#master3

在 master 上升级,在上面安装 kubeadm 命令。

在安装之前,我们需要查看在 kubernetes 界面点击 pods,将,

Namespace 切成 kube-system 默认的管理端运行的 namespace。

能看到 kubernetes 运行的版本。

查看到版本是1.17.2

会获取到当前的版本。然后匹配 kubeadmversion 版本。对比从版本一升级到版本二会有哪些差异。

是否确认升级版本y

每个分别升级,否则可能会影响运行 Kubectlgetpod-a

有些容器正在被创建--正在升级 Master1已经更新成功

升级谁把谁摘走下载定向手动下载定向,下载定向过后升级速度提升Dockerimages 检查定向下载(没有全部下载完毕)可以使用脚本下载定向或手动下载定向。

脚本:

k8s-1.17.4-images-download.sh

只有 k8s 管理端的定向改变。edce 等都没有改变。

Bashk8s-1.17.4-images-download.sh

Dockerpull 手动下载镜像

升级成功会进行通知

Yourclusterwasupgradedto“v11.17.4.enjoy”

Dockerps

升级完成后查询镜像已经下载很多把创建容器的镜像换成新的版本,换成1.17.4镜像等待102升级完成升级完成后可以进入master1进行验证。如果容器的启动没有问题。

在 haproxy 将102和103挂上,将101摘下。将重haproxy启,重启后在进行升级

将101摘下 ak 可以访问吗?

会把请求转发给 haproxy后端服务器

10.验证镜像


二.k8snode 服务

1.升级 k8snode 服务

升级客户端服务 kubectlkubeclet

Kubectlversion 命令更新需手动安装

aptcachemadisonkubelet

把 kubeadm 的和 kubeadm 词条命令安装上。

2.验证当前 node 版本信息

Node 节点还是1.16.1的旧版本

#kubectlgetnode

NAMESTATUSROLESAGEVERSION

kubeadm-master1.magedu.netReadymaster143mv1.17.3

kubeadm-master2.magedu.netReadymaster137mv1.17.3

kubeadm-master3.magedu.netReadymaster136mv1.17.3

node1.magedu.netReady115mV1.17.3

node2.magedu.netReady113mv1.17.3

node3.magedu.netReady113mv1.17.3

3.升级 node 节点配置文件

在控制端

#kubeadmupgradenode--kubeletversion1.17.4

[upgrade]Readingconfigurationfromthecluster..

[upgrade]FY:Youcanlookatthisconfigfilewith'kubectl

-nkube-systemgetcmkubeadm-config-oyaml'

[upgrade]UpgradingyourStaticPod-hostedcontrolplane

instancetoversion"v1.174"..Staticpod:kube

-apiserver-kubeadmmaster1.magedu.nehash:

9b27fdd11086b9631e6ecf20b210a801

Staticpod:kube-controller-manager

-kubeadm-master1.magedu.nethash:

9f58505c8c69357c59a517de8dd0d70e

Staticpod:kube-scheduler-kubeadm-master1.magedu.nethash:

0621ae8690c69d1d72f746bc2de0667e

[upgrade/etcd]UpgradingtoTLSforetcd

[upgrade/etcd]Nonfatalissueencounteredduringupgrade:the

desiredetcdversionforthisKubernetesversion"v1.17.4"is

"3.4.3-0",butthecurrentetcdversionis"3.4.3".Won't

downgradeetcd,insteadjustcontinue

[upgrade/staticpods]WritingnewStaticPodmanifeststo

"/etc/kubernetes/tmp/kubeadm-upgradedmanifests356491761

W032214:27:2945807688620manifests.go:214]thedefaultkube

apiserverauthorization-modeis"Node,RBAC";using

"Node,RBAC"

[upgrade/staticpods]Preparingfor"kubeapiserver"upgrade

[upgrade/staticpods]Currentandnewmanifestsofkube

-schedulerareequal,sippingupgrade[upgrade]Thecontrol

planeinstanceforthisnodewasuccesfullyupdatedl

(upgrade]Usingkubeletconfigversion1.17.4,while

kubernetes-versionisv1.174

[kubelet-start]Downloadingconfigurationforthekubeletfrom

the"kubelet-config-1.17"ConfigMapinthekube-system

namespace

[kubelet-start]Writingkubeletconfigurationtofile

"/var/lib/kubelet/config.yaml"

[upgrade]Theconfigurationforthisnodewassuccessfully

updated!

[upgrade]Nowyoushouldgoaheadandupgradethekubelet

packageusingyourpackagemanager.

升级master

每个 master 都升级成1.17.4

(使用 kubeadmadm)

1.先安装指令版本的 Kubeadm

2.Kubeadmupgradeplan 查看升级计划

3.Kubeadmupgradeapply1.17.4

不检查直接升级也可以(保证无错误)

容器正在被创建

升级服务端,此版本由 kubectl 控制

验证服务端是否升级成功

查看 pod 使用的镜像,版本是否为1.17.4

Pod 启动时所加载的参数,找到官方的二进制,把二进制放入某地址,

直接通过本地运营起来.

kube-apiserver

-advertise-sddress=172.31.3.102

-allovprivileged-true

-authorization-modemNode,RBAC

-client-cafile-/etc/ubernetez/pki/ca.ert

-ensble-adnissiom-plugins-NodeReatriction

-enable-bootstrap-token-auth=true

-etcd-cafilerlete/kubernetes/pki/etcd/ca.crt

etcd-ceztfile/etc/kubernetes/pki/apiserver-etcd-client.crdt

keytilem/etc/zubernetes/pki/apisexver-etcd-client.key

etcdsarver-https://127.0.0.1:2379

cwemDort=0

kubelet-client-certificat/tckubernetna/pki/aoinexver-kublet

-client.et"

xubelet-client-key-/etc/ubernetet/pki/apiezverkubeltclient.

key

kubeletprefenzed-address-typeInternall,ExternallP,Hostnke

proxy-client-cert-file/etc/kubexrntespki/fzontroroslient.

crt

proxyclient-keyfile-/tc/rubcrnetes'pki/f

antrroxyrelient.key

requestheader-allowednanes=frontmromrelient

requestheadex-client-cafileetc/kubernntsrkiitrontroryr-ca.

crt

requestheader-extra-headersprefiremoteEtra

requeatheadercroupmheadersKkenoteGroup

requeatheadermusernaseheaderXRenot-Uter

eCure-port=0443

sevice-account-keyfil/etc/rubernetes/pki/sa.pub

mservice-clurteriprange192.108.0.0/20

wmtlamcertfilo-/etc/kubernetes/pki/apiserver.crt

tiprivatekeyfile/etc/kubernetes/pki/apiserver.key

跑在各个节点上的 kubelet 成为1.17.4版本,所以显示 node 节点的版本也是1.17.4

Kube-proxy 用镜像跑

用镜像查看是否存在1.17.4的 Kube-proxy

总 pod 有6个

4.各 Node 节点升级 kubelet 二进制包:

包含 master 节点在的 kubectl、kubelet 也要升级。

AptInstall

kubelet=1.17.4-00kubeadm1.17.4-00kubect1=1.17.4-00

验证最终版本。

在各个 node 节点使用 aptinstallkubectl=1.17.4-00

Node 节点两个命令

Kubeadmkubelet

Kube 磁条是客户端相同版本客户端的兼容性是最好的

用1.17.4的 kubeadm 磁条版本访问1.17.4的 master 是最好的


三.测试与运行

1.测试运行 nginx+tomcat

https://kubernetes.io/zh/docs/concepts/workloads/controllers/deplyment/

测试运行 nginx,并最终可以将实现动静分离

使用1.17版本的原因:该版本兼容性做好

官网查找

创建 Deployment

下面是一个 Deployment 示例。

其中创建了一个 ReplicaSet,负责启动三个 nginxPods:

controllers/nginx-deployment.yaml

apiVersion:apps/v1

kind:Deployment

metadata:

name:nginx-deployment

labels:

app:nginx

spec:

replicas:3

selector:

matchLabels:

app:nginx

template:

metadata:

labels:

app:nginx

spec:

containers:

-name:nginx

image:nginx:1.14.2

ports:

-containerPort:80

2.运行 Nginx:

#pwd

/opt/kubdadm-yaml

#catnginx/nginx.ymI

apiVersion:apps/v1

kind:Deployment

metadata:

namespace:default

name:nginx-deploymentlabels:

app:nginx

spec:

replicas:1

selector:-

matchLabels:

app:nginx

template:

metadata:

labels:

app:nginx

spec:

containers:

-name:nginx

image:nginx:1.15.4ports:

-containerPort80

kind:Service

apiVersion:V1

metadata:

labels:

app:magedu-nginx-service-labelname:magedu-nginx-service

namespace:default

spec:

type:NodePort

ports:

name:http

port:80

protocol:TCPtargetPort:80nodePort:30004selector:

app:nginx

I

#kubectlapply-nginx/nginx.yml

实行回滚

---分割符前面是一对段配置,后面是独立的另外一段配置

Kubectlapply-fnginx-yml 运行

查看容器是否能通

每个容器分配不同页面

进入目录编辑文件

将每个pod 分配不同页面

用不同浏览器访问的pod不同

通过haproxy代理nodeport不会让用户访问不会让防火墙直接转入

nodeport,因为防火墙不具备一对多的关系。只能把一个共享地址翻

译成一个内网地址,也不具备状态检测功能。

修改方法:

可以加入监听

生成249ip

挂1/2个服务器不影响访问。

249没有编辑配置文件,生成一个249的IP,用249作为某个业务项

目的入口,在这个基础上进行动静分离。

此时附带平衡被完成。

直接访问 IP 即可,通过249运行解释。

Linux39可以访问很多个域名。

放入目录 kubdadm-linux39mkdirnginx-yml

进入创建 nginx-yml

在 yml 中通过 image 指定镜像

能够实现内外网通信,Nds 调用 tomat

Service示例:

apiVersion:v1

kind:Service

metadata:

name:default-subdomain

spec:

selector:

name:busybox

clusterIP:None

ports:

-name:foo#实际上不需要指定端口号

port:1234

targetPort:1234

---

apiVersion:v1

kind:Pod

metadata:

name:busybox1

labels:

name:busybox

spec:

hostname:busybox-1

subdomain:default-subdomain

containers:

-image:busybox:1.28

command:

-sleep

-"3600"

name:busybox

---

apiVersion:v1

kind:Pod

metadata:

name:busybox2

labels:

name:busybox

spec:

hostname:busybox-2

subdomain:default-subdomain

containers:

-image:busybox:1.28

command:

-sleep

-"3600"

name:busybox

3.运行 tomcat

#pwd

/opt/kubdadm-yaml

#cattomcat/tomcat.ymlapiVersion:apps/v1

kind:Deployment

metadata:

namespace:default

name:tomcat-deploymentlabels:

app:tomcat

spec:

replicas:1

selector:

matchLabels:

app:tomcat

Dockerpulltomcat

访问经过负载平衡到 nodeport 交给 n-sservice 再到 n-sport。如

果是自己的请求自己处理若不是自己的请求查看如何转化给 tomcat。涉及到kubeDNS里面的服务是如何做调用。

Dockerrun-it--人们-怕8080:8080tomcat

做镜像进入查看目录

Userlocaltomcat

创建app,

Mkdirapp

写入 index.html

Viapp/index.html

确认可以访问 tomcat 首页文件,容器便可以使用

把 tomcat 容器跑到 kubeNDS

方法:

创建 dockerfile 目录,进入目录,vimdockerfile,在本地创建目录 app,写页面

Tomcatappimagewebpage 进行简单测试,把镜像传到本地

harbor.Linux39.com/Linux39.com/tomcat:app

查看此镜像页面能否访问

成功后将镜像传:

Dockertage

Dockerpush

FORMtomcat

ADD./app/user/local/tomcat/webapps/app

把 n-s 目录拷到当前目录下

Port:sercive 的 port

Nodeport:只能用一次

创建完成后,getport 查看 tomcat 是否运行成功

数量写一个避免占用资源过多。

此时查看是否可以访问 tomcat,在浏览器访问172.31.3.108:30005

发现,此时已经寻找到 tomcat,单位添加app

2.测试访问 web 页面

172.31.3.108:30005/app

(访问成功)

此时 nginx 与 tomcat 已经运行,但是 tomcat 作为被 nginx 调动的服

务,不被直接调用

30005只是临时端口用于测试

对外端口只需要n-s把tomcat注释掉:

此时再次访问失败

3.web 界面验证 pod

Kubectlexec-it 进入磁条

安装 vim 命令

直接在容器安装

进入 pod 找到 nginx 配置文件

进入 conf.d 编辑 default.conf

Vimdefault.conf

写入 location

一旦访问 app 就转化到 tomcat 中

Kubectl 磁条 getservice

如何分配 service

域名必须解析

检查从 nginx 能否解析 servicename

验证解析结果是否是从 tomcat 查看的结果

Service 在 tomcat 是80

所以是相同的。

请求此端口会被 service 转化到 tomcat80

Kubectldescribeservice

查看 service 后端服务器

10.10.4.12:8080

Port-portnginx-nginxnginx-service

4.从dashboard 进入容器

仅需要把 atp 的请求已http的方式转化到service,不用写tomcat容器地址,因为后期容器地址一般会发生变化。只要保证从内网到外网,从外网到内网是正常运行。


四.kubeadm 其他命令

1.token 管理:

#kubeadmtoken--help

create#创建 token,默认有效期24小时

delete#删除 token.

generate#生成并打印 token,但不在服务器上创建,即将 token 用于其他操作 list

#列出服务器所有的 token.

若过期:kubeadmtokencreate[token]

可以直接创建

若 token 不安全可以进行删除操作 Delete

2.reset 命令:

#kubeadmreset#还原 kubeadm 操作。

还原 kubeadm 产生的数据

kubeadm 有3个 master

关机(poweroff)查看 kubeadm 管理端使用是否正常

Kubectlgetnode 验证,查看关闭一个节点集群是否被影响。

不影响

关闭两个会受到影响,即只可以关闭一个。

检测出现异常

关闭两个会受到影响,即只可以关闭一个。

出现报错

2个节点都不可以关闭,3个节点可关闭1个,5个 master可以关闭

2个节点。Node 节点正常运行,不被影响。

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
5月前
|
存储 安全 应用服务中间件
将下载的Nginx证书转换为Tomcat证书格式
好,可以看到,将Nginx证书转换为Tomcat证书的过程就像在烘焙一块蛋糕。你需要准备材料(证书),配备工具(OpenSSL, keytool),按照一定的步骤慎重制作,最后你就拥有了一块可以在浏览器中呈现出漂亮的安全状态的HTTPS蛋糕。就这么简单,明了,没有任何复杂的理论知识,就像在家庭厨房里烘焙的快乐一样。
221 16
|
5月前
|
负载均衡 前端开发 应用服务中间件
Tomcat的负载均衡和动静分离(与nginx联动)
总的来说,负载均衡和动静分离是提高Web应用性能的两个重要手段。通过合理的配置和使用,我们可以让Web应用更好地服务于用户。
168 21
|
5月前
|
负载均衡 Java 应用服务中间件
Tomcat与Nginx的负载均衡与动静分离技巧
总的来说,Tomcat和Nginx各有各的优点,在负载均衡和动静分离这两方面它们都有很好的应用。灵活使用这两个工具能够让Web应用具有更好的扩展性和用户体验。
152 14
|
5月前
|
负载均衡 前端开发 JavaScript
LVS-DR模式、keepalived、Nginx与Tomcat合作,打造动静分离,高效负载均衡与高可用性
为了采用这样的架构,你需要对LVS-DR、Keepalived、Nginx与Tomcat有一定的理解和掌握,同时也需要投入一些时间去研究和配置,但是一旦你把它运行起来,你将会发现,这一切都是值得的。
191 11
|
6月前
|
Kubernetes 安全 应用服务中间件
IngressNightmare:Ingress Nginx 再曝5个安全漏洞,可接管你的 K8s 集群
是否还记得 2022 年 K8s Ingress Nginx 披露了的 3 个高危安全漏洞(CVE-2021-25745, CVE-2021-25746, CVE-2021-25748),并在那一年宣布停止接收新功能 PR,专注修复并提升稳定性。
|
10月前
|
缓存 Java 应用服务中间件
nginx的正向代理和反向代理以及tomcat
Nginx的正向代理和反向代理功能在不同的场景中具有重要作用,正向代理主要用于客户端访问控制和匿名浏览,而反向代理则用于负载均衡和高可用性服务。Tomcat作为Java Web应用服务器,与Nginx结合使用,可以显著提升Web应用的性能和稳定性。通过合理配置Nginx和Tomcat,可以构建高效、稳定和可扩展的Web服务架构。
356 11
|
Kubernetes 应用服务中间件 nginx
k8s学习--YAML资源清单文件托管服务nginx
k8s学习--YAML资源清单文件托管服务nginx
223 2
k8s学习--YAML资源清单文件托管服务nginx
|
Kubernetes 监控 测试技术
k8s学习--基于Ingress-nginx实现灰度发布系统
k8s学习--基于Ingress-nginx实现灰度发布系统
470 2
k8s学习--基于Ingress-nginx实现灰度发布系统
|
Kubernetes 负载均衡 应用服务中间件
k8s学习--ingress详细解释与应用(nginx ingress controller))
k8s学习--ingress详细解释与应用(nginx ingress controller))
1869 0
|
5月前
|
资源调度 Kubernetes 调度
从单集群到多集群的快速无损转型:ACK One 多集群应用分发
ACK One 的多集群应用分发,可以最小成本地结合您已有的单集群 CD 系统,无需对原先应用资源 YAML 进行修改,即可快速构建成多集群的 CD 系统,并同时获得强大的多集群资源调度和分发的能力。
213 9