K8S 入门 - 搭建nginx服务

4 篇文章 0 订阅
2 篇文章 0 订阅

写在前面:

首先要了解k8s的几个关键词(pod,deployment,service,namespace...).这里大概介绍一下,后面我们需要用到。

pod: 在Kubernetes集群中,Pod是所有业务类型的基础,也是K8S管理的最小单位级,它是一个或多个容器的组合。可以理解为运行的容器。相关的操作有:

# 特定namespace下的所有pods
docker get pods -n "namespace名称"

# 所有namespace下的pods
docker get pods -all-namespaces/ -A

#删除某个pod
kubectl delete pod "pod名字" -n "namespace名称"

#删除pod的时候,会重新创建pod,这是因为deployment声明了副本的数量,我们需要删除deployment
kubectl get deployment -n  "namespace名称"
kubectl delete deployment "deployment名字"  -n  "namespace名称"

#获取某个pod的详细信息(排查错误必备)
kubectl describe pod "pod名字" -n "namespace名称"

service: 主要是提供负载均衡和服务自动发现,nginx服务的端口映射,就需要在这里面配置。相关的操作有:

#所有的services
kubectl get services

#删除特定service
kubectl delete service "service名字"

namespace: 顾名思义,”域“。你可以把一组特定的服务放在一个namespace下面。比如nginx的pod放在nginx域下面:相关的操作有:

#所有的namespace
kubectl get namespaces

#删除namespace
kubectl delete namespace "namespace名称"

这里简单介绍这些,后面补充(欢迎来怼)。

 

一,创建 namespace

nginx-namespace.yaml:

apiVersion: v1
#namespace固定写法
kind: Namespace
metadata:
  name: nginx
  labels:
    name: nginx

我们可以使用kubectl apply/create -f nginx-namespace.yaml来创建namespace:

kubectl create -f nginx-namespace.yaml

创建成功后,可以查看我们刚刚创建的namespace:

 二,创建deployment

其实,我们的目的是创建pod,deployment可以说是担任了 ”管理“ 的角色吧,通过它可以部署很多pod。它拥有强更加灵活强大的升级、回滚功能,并且支持滚动更新。具体可以百度。

nginx-deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx
  name: nginx-deployment
  #指定域
  namespace: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - image: nginx:1.14.0
        name: nginx
        volumeMounts:
        - name: conf
          mountPath: /etc/nginx/nginx.conf
        - name: log
          mountPath: /var/log/nginx/
        - name: html
          mountPath: /etc/nginx/html
      #标签选择器(集群状态下,可以指定服务部署在特定node节点上,这就是标签的作用)
      #nodeSelector:
        #type: nginx
      #设置污点可以调度到对应服务器
      tolerations:
      - key: "key"
        operator: "Equal"
        value: "nginx"
        effect: "NoSchedule"
      volumes:
      - name: conf
        hostPath:
          path: /usr/local/nginx/conf/nginx.conf
      - name: log
        hostPath:
          path: /usr/local/nginx/logs
          type: Directory
      - name: html
        hostPath:
          path: /usr/local/nginx/html
          type: Directory

和docker compose的 微服务文件虽然格式变化很大,但是核心思想还是不变的。都是指定镜像,数据卷,分片数量,名称等。最主要的还是要 指定 namespace。

我们依然使用 kubectl apply/create -f nginx-deployment.yaml 来生成pod

kubectl create -f nginx-deployment.yaml

接下来我们来查看刚刚创建成功的pod

 注意里面的状态(ready,status),ready下面的1 和 刚刚我们生命的分片数量(spec.replicas)有关。running代表成功,其他几个状态这里就不说哦了,反正除了这个都是失败。

注意:

因为默认kubernetes默认不让pod部署到master节点,但是我在测试环境只有一个节点也是master节点,需要允许master节点部署pod

kubectl taint nodes --all node-role.kubernetes.io/master-

 如果想要禁止,则执行以下命令

kubectl taint nodes k8s node-role.kubernetes.io/master=true:NoSchedule

那如果失败的话,我们怎么排查呢。拿走,不谢。

这里有pod的详细信息,自行查阅,一般都是数据卷映射出错,镜像拉取出错,端口冲突等等。 

注意:虽然pod创建完成,但是通过ip:port,你还真是访问不到,还需要下面的service做辅助。

三,创建service

每个 Pod 都有自己的 IP 地址。当 controller 用新 Pod 替代发生故障的 Pod(重启策略,或者删除重新创建等等) 时,新 Pod 会分配到新的 IP 地址。这样就产生了一个问题:

如果一组 Pod 对外提供服务(比如 HTTP),它们的 IP 很有可能发生变化,那么客户端如何找到并访问这个服务呢?

Kubernetes 给出的解决方案是 Service。

话不多说,上才艺。

nginx-service.yaml:

apiVersion: v1
kind: Service
metadata:
  labels:
    app: nginx
  name: nginx-deployment
  namespace: nginx
spec:
  ports:
  - port: 80      // 配置NodePort,外部流量可访问k8s中的服务
    name: nginx-service80
    protocol: TCP
    targetPort: 80   // 服务访问端口(外部访问)
    nodePort: 80     // pod控制器中定义的端口
  - port: 81
    name: nginx-service81
    protocol: TCP
    targetPort: 81
    nodePort: 81
  selector:
    app: nginx
  type: NodePort

这里就声明了宿主机(nodeport)80 映射容器(targetport)80。

创建服务:

kubectl create -f nginx-service.yaml

.四,大功告成

拉出来溜溜

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值