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暴露出来的可供外部访问的接口
k8s学习_第1张图片
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
k8s学习_第2张图片
我们创建新的pod也可以通过kubectl apply 加yaml格式文件来创建。
在创建之前先说一个概念 namespace(ns),即命名空间。通过命名空间可以将pod隔离,比如分别在dev和test两个命名空间各创建一个nginx给不同的开发小组使用,互补干扰,用来部署不同的前端项目或者反向代理等等。
创建命名空间:kubectl create ns dev
k8s学习_第3张图片
通过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节点,所以可以直接访问。容器端口不能写错,写错了就访问不了了
k8s学习_第4张图片
通过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会暴露一个宿主机的端口,通过这个端口
k8s学习_第5张图片
通过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 #容器镜像

k8s学习_第6张图片
这里创建了三个标签为nginx-podpod副本,所以在实际使用中一般不会直接创建pod而通过deployment来管理pod。

你可能感兴趣的:(java学习,kubernetes,学习,docker)