当前位置:首页 > 前沿科技 > 正文

k8s实战

下面进行k8s的实战,主要是pod,service,ingress,pv,pvc,configmap,secret这些,下面开始。一、环境如下就按我上一篇帖子搭建的环境来操作:k8s集群环境搭建k8s-new-master:192.168.192.8k8s-new-node1:192.168.192...

下面进行k8s的实战,主要是pod,service,ingress,pv,pvc,configmap,secret这些,下面开始。一、环境如下就按我上一篇帖子搭建的环境来操作:k8s集群环境搭建k8s......

下面进行k8s的实战,主要是pod,service,ingress,pv,pvc,configmap,secret这些,下面开始。

一、环境如下

就按我上一篇帖子搭建的环境来操作:k8s集群环境搭建

k8s-new-master:192.168.192.8k8s-new-node1:192.168.192.9k8s-new-node2:192.168.192.10

用户密码:root/forever
控制台:
登录token:

eyJhbGciOiJSUzI1NiIsImtpZCI6pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJhZG1pbi11c2VyLXRva2VuLXRqbXJwIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6ImFkbWluLXVzZXIiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiJmN2M3OGJkZi0xN2YzLTQxY2UtYmVhNS1lYzA0MDY4ZDgxYTQiLCJzdWIiOiJzeXN0ZW06c2PkM1FUsMxxeNZMvRvjOI7Ju9AVUQkG7bz3skd1I_yZSoiOlcc6_woCXZ0az_nOGwvjjYeE8s8TuBT0nGkiKyZBiruyjyluHJyvv_wYex4DsyGUTKytX7ab0ndSz67JdVvzsfKjOrHmvSc_93D_mWvPwuboma-22qtdH5B-OZ3LOtj-15jRdSd3B4fTsZkw8Sijjgda5ltfncYvg-MJbAq0BEOhYYzmLL5p6CfD5Nq9rnDC1NcrMQfkUu3FblekDfWasHqRvM7iEBr_G0dvuh_Pg

相关命令

查看podkubectlgetpods-A查看pod的ipkubectlgetpods-owide
二、开始实战(pod,service,ingress)1、资源创建方式

我们创建资源可以通过命令行直接创建,也可以通过YAML文件来创建

●命令行
●YAML

2、Namespace

名称空间用来隔离资源

用命令行的模式建立

查看kubectlgetns查看default名称空间的Podkubectlgetpod查看Pod的运行日志kubectllogsPod名字使用Pod的ip+pod里面运行容器的端口:defaultspec:containers:-image:nginxname:mynginx3

tomcat/nginx,这个相当于一个pod里面有两个容器,端口不通,nginx是80,tomcat是8080

apiVersion:v1kind:Podmetadata:labels:run:myappname:myappspec:containers:-image:nginxname:nginx-image:tomcat:8.5.68name:tomcat

执行命令都是

kubectlapply-fyaml文件名

查看pod的IP

[root@k8s-new-master~]kubectlgetpodNAMEREADYSTATUSRESTARTSAGEmytomcat-6f5f895f4f-9dx2n1/1Running013smytomcat-6f5f895f4f-ppz460/1Terminating02m21s

得把所有pod删掉先,不然怕内存不够

kubectldeletepodmyappkubectldeletepodmynginxkubectldeletepodmynginx2kubectldeletepodmynginx3删除部署kubectldeletedeploymentmytomcat

部署只能删除部署,如果只删除pod会自愈的。

4-2、多副本

可以用命令行

kubectlcreatedeploymentmy-dep--image=nginx--replicas=3

或者使用yaml创建多副本

apiVersion:apps/v1kind:Deploymentmetadata:labels:app:my-depname:my-depspec:replicas:3selector:matchLabels:app:my-deptemplate:metadata:labels:app:my-depspec:containers:-image:nginxname:nginx

执行命令当然是

kubectlapply-fyaml文件名

查看可以知道

[root@k8s-new-master~]kubectlgetpods-owideNAMEREADYSTATUSRESTARTSAGEIPNODENOMINATEDNODEREADINESSGATESmy-dep-5b7868d854-495hg1/1/1/1

发现有一个是在节点1,那我们尝试把节点1,关闭,看看如何

[root@k8s-new-master~]修改replicas到2

wq报错完后就可以看到缩容了,有三个节点Terminating

[root@k8s-new-master~]历史记录kubectlrollouthistorydeployment/my-dep回滚(回到上次)kubectlrolloutundodeployment/my-dep暴露Deploykubectlexposedeploymentmy-dep--port=8000--target-port=80kubectlgetsvcNAMETYPECLUSTER-IPEXTERNAL-IPPORT(S)//TCP56s

通过访问10.96.191.91来测试

:8000

我们验证下有没有负载均衡的效果

先查询容器

[root@k8s-new-master~]这里进去设置为1kubectlexec-timy-dep-5b7868d854-5jrv5-ndefaultshcd/usr/share/nginx/htmlecho'1':80002[root@k8s-new-master~]:80001[root@k8s-new-master~]等同于没有--type的kubectlexposedeploymentmy-dep--port=8000--target-port=80--type=ClusterIP
apiVersion:v1kind:Servicemetadata:labels:app:my-depname:my-depspec:ports:-port:8000protocol:TCPtargetPort:80selector:app:my-deptype:ClusterIP

如果要宿主机可以访问,需要用NodePort模式

5-2、NodePort

命令版

kubectlexposedeploymentmy-dep--port=8001--target-port=80--type=NodePort

yaml版:

apiVersion:v1kind:Servicemetadata:labels:app:my-dep2name:my-dep2spec:ports:-port:8000protocol:TCPtargetPort:80selector:app:my-deptype:NodePort

创建

查看

[root@k8s-new-master~]

我们在浏览器访问任意一个节点

NodePort范围在30000-32767之间,所以防火墙或者工作组要放开这些端口

6、Ingress

Kubernetes关于服务的暴露主要是通过NodePort方式,通过绑定宿主机的某个端口,然后进行pod的请求转发和负载均衡,但这种方式下缺陷是:

Service可能有很多个,如果每个都绑定一个node主机端口的话,主机需要开放外围一堆的端口进行服务调用,管理混乱无法应用很多公司要求的防火墙规则。

理想的方式是通过一个外部的负载均衡器,绑定固定的端口,比如80,然后根据域名或者服务名向后面的Serviceip转发,Nginx很好的解决了这个需求,但问题是如果有新的服务加入,如何去修改Nginx的配置,并且加载这些配置?Kubernetes给出的方案就是Ingress,Ingress包含了两大主件IngressController和Ingress。

Ingress其实就是对nginx的封装。

6-1、安装
wget:/lfy_k8s_images/ingress-nginx-controller:

如果下载不了文件,就用这个

最后别忘记把svc暴露的端口要放行
6-2、使用
[root@k8s-new-master~]kubectlgetsvc-owideNAMETYPECLUSTER-IPEXTERNAL-IPPORT(S)/TCP69sapp=/TCP69sapp=nginx-demo

6-3-1、域名访问
我们在本地的host准备如下两个域名
C:\Windows\System32\drivers\etc\hosts

192.168.192.10

因为ingress创建后是在192.168.192.10,所以只能配置这个,不能配置其它节点,这个跟service不同

我们来部署个Ingress:

apiVersion:/v1kind:Ingressmetadata:name:ingress-host-barspec:ingressClassName:nginxrules:-host:""http:paths:-pathType:Prefixpath:"/"back:service:name:hello-serverport:number:8000-host:""http:paths:-pathType:Prefixpath:"/nginx"kubectlge,

上面的部署的意思是,如果我们访问

:hello-server
:nginx-demo

然而,访问却啥报错,进不去,why,后面才发现ingress-controller的官方yaml默认注释了hostNetwork工作方式,以防止端口的在宿主机的冲突,没有绑定到宿主机80端口;

需要在deployment里面加入

hostNetwork:true这个字段值

大概在这个位置,大家搜索dnsPolicy就可定位

spec:hostNetwork:truednsPolicy:ClusterFirst

加上后,重新执行

就可以正常访问了。

6-3-2、路径重写

apiVersion:/v1kind:Ingressmetadata:annotations:/rewrite-target:/$2name:ingress-host-barspec:ingressClassName:nginxrules:-host:""http:paths:-pathType:Prefixpath:"/"back:service:name:hello-serverport:number:8000-host:""http:paths:-pathType:Prefixpath:"/nginx(/|$)(.*)"一个节点kubectlexec-tinginx-demo-7d56b74b84-tfpqt-ndefaultshcd/usr/share/nginx/htmlecho'1'1.htmlexit所有机器安装yuminstall-ynfs-utils
1-2、主节点
配置生效exportfs-r
1-3、从节点
执行以下命令挂载nfs服务器上的共享目录到本机路径/root/nfsmountmkdir-p/nfs/:/nfs/data/nfs/datanfs主节点mkdir-p/nfs/data/01mkdir-p/nfs/data/02mkdir-p/nfs/data/03

创建pv

apiVersion:v1kind:PersistentVolumemetadata:name:pv01-10mspec:capacity:storage:10MaccessModes:-ReadWriteManystorageClassName:nfsnfs:path:/nfs/data/01server:192.168.192.8---apiVersion:v1kind:PersistentVolumemetadata:name:pv02-1gispec:capacity:storage:1GiaccessModes:-ReadWriteManystorageClassName:nfsnfs:path:/nfs/data/02server:192.168.192.8---apiVersion:v1kind:PersistentVolumemetadata:name:pv03-3gispec:capacity:storage:3GiaccessModes:-ReadWriteManystorageClassName:nfsnfs:path:/nfs/data/03server:192.168.192.8

注意server要修改为自己的主节点ip

查看

[root@k8s-new-master~]kubectlgetpvNAMECAPACITYACCESSMODESRECLAIMPOLICYSTATUSCLAIMSTORAGECLASSREASONAGEpv01-10m10MRWXRetainAvailablenfs2m57spv02-1gi1GiRWXRetainBounddefault/nginx-pvcnfs2m57spv03-3gi3GiRWXRetainAvailablenfs2m57s

发现pv02-1gi已被使用。我们pod申请的是200M,所以最靠近且满足的就是pv02-1gi

2、ConfigMap

抽取应用配置,并且可以自动更新

2-1、redis示例

2-1-1、把之前的配置文件创建为配置集

data是所有真正的数据,key:默认是文件名value:配置文件的内容:|apponlyyeskind:ConfigMapmetadata:name:redis-confnamespace:default

查看cm

[root@k8s-new-master~]指的是redis容器内部的位置ports:-containerPort:6379volumeMounts:-mountPath:/dataname:data-mountPath:/redis-mastername:configvolumes:-name:dataemptyDir:{}-name:configconfigMap:name:redis-confitems:-key::

2-1-3、检查默认配置

[root@k8s-new-master~]找到配置名:6379CONFIGGETmaxmemory1)"maxmemory"2)"0"

配置值未更改,因为需要重新启动Pod才能从关联的ConfigMap中获取更新的值。
原因:我们的Pod部署的中间件自己本身没有热更新能力

3、Secret

Secret对象类型用来保存敏感信息,例如密码、OAuth令牌和SSH密钥。将这些信息放在secret中比放在Pod的定义或者容器镜像中来说更加安全和灵活。

kubectlcreatesecretdocker-registryleifengyang-docker\--docker-username=leifengyang\--docker-password=Lfy123456\--docker-email=534096094@命令格式kubectlcreatesecretdocker-registryregcred\--docker-server=你的镜像仓库服务器\--docker-username=你的用户名\--docker-password=你的密码\--docker-email=你的邮箱地址
[root@k8s-new-master~]#//dockerconfigjson111s

使用,可以从自己的私有仓库拉起

apiVersion:v1kind:Podmetadata:name:private-nginxspec:containers:-name:private-nginximage:leifengyang/guignginx::-name:leifengyang-docker

最后执行这个肯定是报错的啦

kubectldescribepodprivate-nginx

可以看到密码不对的提示

ailedtopullimage"leifengyang/guignginx:":rpcerror:code=Unknowndesc=Errorresponsefromdaemon:Head

好了,实战结束。

教程参考:



2、笔记

最新文章