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

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
简介: 快速学习 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 节点正常运行,不被影响。

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
1月前
|
应用服务中间件 Shell PHP
windows系统配置nginx环境运行pbootcms访问首页直接404的问题
windows系统配置nginx环境运行pbootcms访问首页直接404的问题
|
1月前
|
前端开发 应用服务中间件 nginx
docker运行nginx镜像
这篇文章详细说明了如何在Docker中部署并运行Nginx服务,包括拉取镜像、配置文件的挂载以及容器的启动配置。
166 0
docker运行nginx镜像
|
3月前
|
Prometheus Kubernetes 网络协议
k8s学习笔记之CoreDNS
k8s学习笔记之CoreDNS
|
3月前
|
存储 Kubernetes 数据安全/隐私保护
k8s学习笔记之ConfigMap和Secret
k8s学习笔记之ConfigMap和Secret
|
3月前
|
Kubernetes 容器 Perl
【Azure K8S】AKS升级 Kubernetes version 失败问题的分析与解决
【Azure K8S】AKS升级 Kubernetes version 失败问题的分析与解决
|
3月前
|
Kubernetes 监控 API
在K8S中,RS资源如何实现升级和回滚?
在K8S中,RS资源如何实现升级和回滚?
|
3月前
|
Kubernetes jenkins 持续交付
jenkins学习笔记之二十一:k8s部署jenkins及动态slave
jenkins学习笔记之二十一:k8s部署jenkins及动态slave
|
3月前
|
存储 运维 Kubernetes
k8s学习笔记之StorageClass+NFS
k8s学习笔记之StorageClass+NFS
|
3月前
|
Kubernetes API 开发工具
在K8S中,Deployment的升级过程是什么?
在K8S中,Deployment的升级过程是什么?
|
3月前
|
Kubernetes 容器 Perl
在k8S中,deployment升级策略是什么?
在k8S中,deployment升级策略是什么?