
下面进行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
名称空间用来隔离资源
用命令行的模式建立
查看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、IngressKubernetes关于服务的暴露主要是通过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-utils1-2、主节点
配置生效exportfs-r1-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部署的中间件自己本身没有热更新能力
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、笔记