环境:CentOS7.6

k8s版本: 1.8 

非自有应用

1、只有一个主节点的情况,允许master部署pod

允许master节点部署pod
kubectl taint nodes --all node-role.kubernetes.io/master-
如果不允许调度
kubectl taint nodes master1 node-role.kubernetes.io/master=:NoSchedule
污点可选参数
      NoSchedule: 一定不能被调度
      PreferNoSchedule: 尽量不要调度
      NoExecute: 不仅不会调度, 还会驱逐Node上已有的Pod

2、k8s1.8版本的编排tomcat的文件,文件名:tomcat.yaml(随意取)

apiVersion: apps/v1
kind: Deployment
metadata:
  name: myweb
spec:
  selector:
    matchLabels:
      app: myweb
  replicas: 2
  template:
    metadata:
      labels:
        app: myweb
    spec:
      containers:
      - name: myweb
        image: docker.io/tomcat
        ports:
        - containerPort: 8080

---
apiVersion: v1
kind: Service
metadata:
  name: myweb
spec:
  ports:
  - port: 8099
    targetPort: 8080
    nodePort: 31111
  selector:
    app: myweb
  type: NodePort

在文件目录下执行:

kubectl apply -f tomcat.yaml

3、查看部署情况

 kubectl get pods -o wide

4、如果部署失败了,查看失败原因

kubectl describe pods myweb-56c78c7775-mjjrd

自有应用

如果是自有的应用,需要编写Dockerfile ,步骤如下:

1、编写Dockerfile,文件名就叫Dockerfile,没有后缀

FROM openjdk:8-jdk-alpine
RUN mkdir -p /usr/local/myapp
COPY spring-boot-demo-1.0.jar /usr/local/myapp/myapp.jar
ENTRYPOINT ["java","-jar","/usr/local/myapp/myapp.jar"]

2、构建docker 本地镜像

docker build -t myapp:1.0 .

注意两点:

  • 命令执行必须在Dockerfile文件同目录下
  • 命令后面有个

3、编写服务编排文件

名称随意,后缀yaml,我这里叫:myapp.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp
spec:
  selector:
    matchLabels:
      app: myapp
  replicas: 1
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - name: myapp
        image: myapp:1.0
        ports:
        - containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
  name: myapp
spec:
  ports:
  - port: 8080
    targetPort: 8080
    nodePort: 31001
  selector:
    app: myapp
  type: NodePort

nodePort是当spec.type=NodePort时,指定映射到物理机的端口号(浏览器访问用的)

targetPort是需要转发到后端的端口号(应用的)

port是Service监听的端口号

service具体属性含义如下表

属性名称取值类型是否必选取值说明
versionstringRequiredv1
kindstringRequiredService
metadataobjectRequired元数据
metadata.namestringRequiredService名称,需符合RFC 1035规范
metadata.namespacestringRequired命名空间,不指定系统时将使用名为default的命名空间
metadata.labels[]list自定义标签属性列表
metadata.annotation[]list自定义注解属性列表
specobjectRequired详细描述
spec.selector[]listRequiredLabel Selector 配置,将选择具有指定Label标签的Pod作为管理范围
spec.typestringRequiredService的类型,指定Service的访问方式,默认为ClusterIP。 (1)ClusterIP:虚拟服务IP地址,该地址用于Kubernetes集群内部的Pod访问,在Node上kube-proxy通过设置的iptables规则进行转发。 (2)NodePort:使用宿主机的端口,使能够访问各Node的外部客户端通过Node的IP地址和端口号就能访问服务。 (3)LoadBalancer:使用外接负载均衡器完成到服务的负载分发,需要在spec.status.loadBalancer字段指定外部负载均衡器的IP地址,同时定义nodePort和clusterIP,用于公有环境
spec.clusterIPstring虚拟服务的IP地址,当type=ClusterIP时,如果不指定,则系统进行自动分配,也可以手工指定;当type=LoadBalancer时,需要指定
spec.sessionAffinitystring是否支持session,可选值为ClientIP,默认值为None。 ClientIP:表示将同一个客户端(根据客户端的IP地址决定)访问请求都转发到同一个后端Pod
spec.ports[]listService端口列表
spec.ports[].namestring端口名称
spec.potrs[].protocolstring端口协议,支持TCP和UDP,默认值为TCP。
spec.ports[].portint服务监听的端口号
spec.ports[].targetPortint需要转发到后端Pod的端口
spec.ports[].nodePortint当spec.type=NodePort时,指定映射到宿主机的端口号
statusobject当spec.type=LoadBalancer时,设置外部负载均衡器的地址,用于公有云环境
status.loadBalancerobject外部负载均衡器
status.loadBalancer.ingressobject外部负载均衡器
status.loadBalancer.ingress.ipstring外部负载均衡器的IP地址
status.loadBalancer.ingress.hostnamestring外部负载均衡器的主机名

执行命令:

kubectl apply -f myapp.yaml

如果报错,需要仔细检查格式,空格都不能错。

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐