k8s学习
k8s学习
1、k8s简单使用
# 创建一个deploy
kubectl create deployment nginx --image=nginx
# 暴漏pod,也就是创建一个类型为NodePort的service
kubectl expose deploy nginx --port=80 --target-port=80 --type=NodePort
# 查看service
kubectl get svc
创建好以后就会有一个nginx pod service和deployment
因为我现在是用的minikube,也就是单机版k8s,minikube作为一个特殊的k8s节点node,只能用minikube的ip来访问,这个ip并不是linux的ip:minikube ip
访问nginx:curl 192.168.49.2:30229
,30229端口即service暴露出来的可供外部访问的接口
2、container pod service deployment的关系
(1) container即容器,pod是k8s中运行的最小单元,一个pod中可以有一个或多个容器,通常一个pod中只有一个容器
(2) service是管理pod的,一个pod都有一个ip地址,当一个pod被销毁再创建时他的ip就会变,此时之前的ip就不能访问了,而service管理同一类pod,且service也有一个ip,即使service管理的pod被删掉重新创建了新的pod,通过service的ip仍然可以访问
(3) deployment是pod的控制器,通过deployment可以灵活的创建pod,比如创建几个副本等等,而且当pod被删除,deployment会自动根据副本数量重新创建pod从而保证服务的高可用
3、yaml创建服务
先查看刚才创建的pod的yaml:kubectl get pod nginx-85b98978db-n29vn -o yaml
我们创建新的pod也可以通过kubectl apply
加yaml格式文件来创建。
在创建之前先说一个概念 namespace(ns),即命名空间。通过命名空间可以将pod隔离,比如分别在dev和test两个命名空间各创建一个nginx给不同的开发小组使用,互补干扰,用来部署不同的前端项目或者反向代理等等。
创建命名空间:kubectl create ns dev
通过yaml文件[dev-ns.yaml
]创建命名空间:
apiVersion: v1
kind: Namespace #类型
metadata:
name: dev #名称
kubectl apply -f dev-ns.yaml
通过yaml文件[nginx-pod.yaml] 创建nginx pod:
apiVersion: v1
kind: Pod
metadata:
name: nginx
namespace: dev
labels: #给pod添加标签,这里的标签可以随便打,也就是说nginx和tomcat也可以是同样的标签,虽然实际中打错了肯定会出问题
version: '3.0'
env: dev
app: nginx-pod
spec:
containers:
- image: nginx:latest
name: nginx
ports:
- name: nginx-port
containerPort: 80 # 容器/pod端口
protocol: TCP
hostPort: 8888 # 暴露到宿主机即node的端口
由于上面暴露了8888端口到node节点,所以可以直接访问。容器端口不能写错,写错了就访问不了了
通过yaml文件[nginx-service-nodeport.yaml] 创建类型为NodePort nginx service:
apiVersion: v1
kind: Service
metadata:
name: nginx-service-nodeport
namespace: dev
spec:
selector: #标签选择器,这里通过标签来匹配pod
app: nginx-pod
type: NodePort
ports:
- port: 80 # Service端口
targetPort: 80 # pod端口
里面需要注意的是标签选择器,这个必须能够匹配pod的标签,如果不一样也能创建,但是访问不到pod。port可以随便写,targetPort必须和pod的端口一致,否则访问不了。
可以看到创建了一个service,有个端口映射,通过这个31415端口可以访问nginx,也就是说NodePort类型的service会暴露一个宿主机的端口,通过这个端口
通过yaml文件[nginx-service-nodeport.yaml] 创建类型 nginx deploy:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx #deploy名称
namespace: dev #命名空间
spec:
replicas: 3 # 副本数量
selector: # 选择器,通过它指定该控制器管理哪些pod
matchLabels:
app: nginx-pod #标签可随便写就是key-value
template:
metadata:
labels:
app: nginx-pod #与上面标签匹配
spec:
containers:
- name: nginx #容器名称
image: nginx:1.17.1 #容器镜像
这里创建了三个标签为nginx-pod
pod副本,所以在实际使用中一般不会直接创建pod而通过deployment来管理pod。
更多推荐
所有评论(0)