k8s通过编辑yaml文件,然后使用kubectl create -f 的方式来启动
deployment可以理解为replication controller的升级版本,主要功能有
确保pod的数量: 如果少于指定数量则创建新的,反之会删除多余的以保证pod数量不变
确保pod的健康: 当pod运行出错或者无法提供服务时,会杀掉不健康的pod,重新创建新的
弹性伸缩: 在业务高峰或低峰时,可以通过动态调整pod的数量来提高资源的利用率
滚动升级: 为一种平滑的升级方式,通过逐步替换的策略,保证整体系统稳定,在初期升级的时候, 可以及时
发现和解决问题,避免问题不断扩大
以上为rc的功能,Depolyment还有新特性,如:
事件和状态的查看: 可以查看Deployment的升级详细进度和状态
回滚: 当升级pod镜像或相关参数发现问题时,可以使用回滚操作回滚到上一个稳定的版本或指定版本
版本记录:每一次操作都能保存下来,给后续回滚使用
启动和暂停:对于每一次升级都可以随时暂停和启动
修改dashboard的yaml文件
node1 k8s]# vi kubernetes-dashboard.yaml
修改 57 行为 - --apiserver-host=http://192.168.56.11:8080
下面来看一个Nginx的yaml文件
[root@linux-node1 k8s]# vim nginx-deployment.yaml
kind: Deployment
apiVersion: extensions/v1beta1
metadata:
name: nginx-deployment
spec:
replicas: 3 #保留3个副本
template:
metadata:
labels:
app: nginx #创建service会使用这个标签做关联
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
[root@linux-node1 k8s]# kubectl create -f nginx-deployment.yaml #使用yaml文件
deployment "nginx-deployment" created
[root@linux-node1 k8s]# kubectl get pod #获取pod
NAME READY STATUS RESTARTS AGE
nginx-deployment-1247087418-kg0p3 0/1 ContainerCreating 0 21s
nginx-deployment-1247087418-llb8d 0/1 ContainerCreating 0 21s
nginx-deployment-1247087418-zhdm3 0/1 ContainerCreating 0 21s
[root@linux-node1 k8s]# kubectl get deployment #获取
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
nginx-deployment 3 3 3 0 25s
# kubectl get #可以查看所有指令
You must specify the type of resource to get. Valid resource types include:
* all
* certificatesigningrequests (aka 'csr')
* clusters (valid only for federation apiservers)
* clusterrolebindings
* clusterroles
* componentstatuses (aka 'cs')
* configmaps (aka 'cm')
* daemonsets (aka 'ds')
* deployments (aka 'deploy')
* endpoints (aka 'ep')
* events (aka 'ev')
* horizontalpodautoscalers (aka 'hpa')
* ingresses (aka 'ing')
* jobs
* limitranges (aka 'limits')
* namespaces (aka 'ns')
* networkpolicies
* nodes (aka 'no')
* persistentvolumeclaims (aka 'pvc')
* persistentvolumes (aka 'pv')
* pods (aka 'po')
* poddisruptionbudgets (aka 'pdb')
* podsecuritypolicies (aka 'psp')
* podtemplates
* replicasets (aka 'rs')
* replicationcontrollers (aka 'rc')
* resourcequotas (aka 'quota')
* rolebindings
* roles
* secrets
* serviceaccounts (aka 'sa')
* services (aka 'svc')
* statefulsets
* storageclasses
* thirdpartyresources
error: Required resource not specified.
Use "kubectl explain <resource>" for a detailed description of that resource (e.g. kubectl explain
pods).
See 'kubectl get -h' for help and examples.
现在使用kubectl getpod命令发现容器还在创建中,查看日志发现了报错了
使用kubectl describe pod 查看日志,发现需要修改/etc/docker/daemon.json,
vi /etc/docker/daemon.json
再最后一行加上
"default-ipc-mode": "shareable"
然后重启 docker后不再报错,有2个显示running,还有1个还是在创建中
此时去node2上导入一下之前的2个tar包,pull一下nginx的镜像,然后修改node2的/etc/docker/daemon.json 文件,
在最后加上
"default-ipc-mode": "shareable" 然后重启node2的docker后,就可以发现3个pod的状态都是running了
kubectl delete -f nginx-deployment.yaml 启动yaml文件
kubectl create -f nginx-deployment.yaml 删除yaml文件
kubectl logs pod名称 查看日志 可能需要--namespace=kube-system参数
下面切换回node1
可以用下面的命令去获取pod ip 但是一般用不到,因为pod重建后ip就会发生变化
[root@linux-node1 k8s]# kubectl get pods -o yaml -l app=nginx | grep podIP
下面开始创建服务
[root@linux-node1 k8s]# vim nginx-service.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx-demo
labels:
app: nginx
spec:
ports:
- port: 80
protocol: TCP
selector:
app: nginx
保存退出
[root@linux-node1 k8s]# kubectl create -f nginx-service.yaml #启动服务
service "nginx-demo" created
[root@linux-node1 k8s]# kubectl get service
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes 10.1.0.1 <none> 443/TCP 7h
nginx-demo 10.1.37.4 <none> 80/TCP 1m 刚刚出创建的
[root@linux-node1 k8s]# curl --head http://10.1.37.4
HTTP/1.1 200 OK
Server: nginx/1.17.9
Date: Thu, 05 Mar 2020 17:07:27 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Tue, 03 Mar 2020 14:32:47 GMT
Connection: keep-alive
ETag: "5e5e6a8f-264"
Accept-Ranges: bytes
其中上面的 10.1.37.4 这个ip时在启动api时传了一个ip地址范围,那个范围是10.1网段,而之前查看pod ip时发现
是10.2网段,这是因为kubeproxy转换的,如果kubeproxy挂了,就无法访问这个ip(10.1.37.4)了
可以将之前的nginx-deployment.yaml和nginx-service.yaml合并,即书写一份 然后运行
下面启动dashboard
[root@linux-node1 k8s]# kubectl create -f kubernetes-dashboard.yaml
deployment "kubernetes-dashboard" created
service "kubernetes-dashboard" created
[root@linux-node1 k8s]# kubectl get deployment #发现看不到
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
nginx-deployment 3 3 3 3 6h
[root@linux-node1 k8s]# kubectl get deployment --namespace=kube-system
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
kubernetes-dashboard 1 1 1 1 21s
因为是使用了系统的namespace 所以需要加上--namespace=kube-system参数
[root@linux-node1 k8s]# kubectl get pod --namespace=kube-system
NAME READY STATUS RESTARTS AGE
kubernetes-dashboard-1811738726-0jfl4 1/1 Running 0 1m
[root@linux-node1 k8s]# kubectl get service --namespace=kube-system
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes-dashboard 10.1.158.203 <nodes> 80:32105/TCP 2m
注意 上面的80:32105/TCP中的 32105 为nodepod 10.1.158.203 这个ip是service的ip是不会变的
我们可以通过宿主机的ip机上这个port去访问dockerdashboard
现在就可以打开http://192.168.56.11:32105了,通过这种nodepod的方式(会将service的端口映射到每一个node上
),所以使用http://192.168.56.11:32105也可以打开,如果访问不到则说明这个节点kubeproxy挂掉了
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)