开发者学堂课程【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 节点正常运行,不被影响。