云原生架构实战03 核心实战
  dBFTbkVLMBge 2023年11月02日 22 0
k8s

1、资源创建方式

命令行

YAML


2、Namespace

名称空间隔离资源

kubectl create ns hello
kubectl delete ns hello
apiVersion: v1
kind: Namespace
metadata:
  name:hello

云原生架构实战03 Kubernetes核心实战_k8s

kubectl get ns
kubectl get pods -A
kubectl delete ns my-istio-ns

云原生架构实战03 Kubernetes核心实战_k8s_02

云原生架构实战03 Kubernetes核心实战_k8s_03

云原生架构实战03 Kubernetes核心实战_k8s_04

3、Pod

运行中的一组容器,Pod是kubernetes中应用的最小单位

云原生架构实战03 Kubernetes核心实战_k8s_05

云原生架构实战03 Kubernetes核心实战_k8s_06

kubectl run mynginx --image=nginx

# 查看default名称空间的Pod
kubectl get pod 
# 描述
kubectl describe pod 你自己的Pod名字
# 删除
kubectl delete pod Pod名字
# 查看Pod的运行日志
kubectl logs Pod名字

# 每个Pod - k8s都会分配一个ip
kubectl get pod -o wide
# 使用Pod的ip+pod里面运行容器的端口
curl 192.168.169.136

# 集群中的任意一个机器以及任意的应用都能通过Pod分配的ip来访问这个Pod

云原生架构实战03 Kubernetes核心实战_k8s_07

如果创建pod失败报错,可能是istio没有删除干净导致

卸载istio不彻底可以手动删除下webhook钩子,参考博客

https://blog.csdn.net/chunmiao3032/article/details/123936180

删除istio所有组件 istioctl x uninstall --purge

通过配置文件创建pod  使用kubectl apply -f nginx.yaml运行创建

apiVersion: v1
kind: Pod
metadata:
  labels:
    run: mynginx
  name: mynginx
#  namespace: default
spec:
  containers:
  - image: nginx
    name: mynginx

云原生架构实战03 Kubernetes核心实战_k8s_08

通过配置文件删除pod

kubectl delete -f nginx.yaml

云原生架构实战03 Kubernetes核心实战_k8s_09

云原生架构实战03 Kubernetes核心实战_k8s_10

可视化操作

云原生架构实战03 Kubernetes核心实战_k8s_11

创建mynginx成功,从页面可以看出来

云原生架构实战03 Kubernetes核心实战_k8s_12

通过页面管理pod

云原生架构实战03 Kubernetes核心实战_k8s_13

如果通过kubectl想进入pod里面 命令如下

kubectl exec -it mynginx -- /bin/bash

或者在可视化界面点pod的执行,效果一样,都是进入了pod中的命令行

云原生架构实战03 Kubernetes核心实战_k8s_14

云原生架构实战03 Kubernetes核心实战_k8s_15

继续创建多容器的pod

apiVersion: v1
kind: Pod
metadata:
  labels:
    run: myapp
  name: myapp
spec:
  containers:
  - image: nginx
    name: nginx
  - image: tomcat:8.5.68
    name: tomcat

云原生架构实战03 Kubernetes核心实战_k8s_16

云原生架构实战03 Kubernetes核心实战_k8s_17

从可视化界面看,也是在pod中安装了nginx和tomcat两个pod

云原生架构实战03 Kubernetes核心实战_k8s_18

云原生架构实战03 Kubernetes核心实战_k8s_19

4、Deployment

控制Pod,使Pod拥有多副本,自愈,扩缩容等能力

先删除已有的pod

kubectl delete pod mynginx myapp

云原生架构实战03 Kubernetes核心实战_k8s_20

# 清除所有Pod,比较下面两个命令有何不同效果?
kubectl run mynginx --image=nginx

kubectl create deployment mytomcat --image=tomcat:8.5.68
# 自愈能力

删除pod,自愈能力还会自动创建新的pod,需要删除部署deploy才可以生效

云原生架构实战03 Kubernetes核心实战_k8s_21

1、多副本

kubectl create deployment my-dep --image=nginx --replicas=3
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: my-dep
  name: my-dep
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-dep
  template:
    metadata:
      labels:
        app: my-dep
    spec:
      containers:
      - image: nginx
        name: nginx
kubectl apply -f mutibackup.yaml 
#执行多副本部署

云原生架构实战03 Kubernetes核心实战_k8s_22

2、扩缩容

云原生架构实战03 Kubernetes核心实战_k8s_23

kubectl scale deployment/my-dep --replicas=5

云原生架构实战03 Kubernetes核心实战_k8s_24

云原生架构实战03 Kubernetes核心实战_k8s_25

或者使用以下的命令 也可以修改副本数,实现扩容和缩容

kubectl edit deployment my-dep
#修改 replicas

3、自愈&故障转移

  • 停机
  • 删除Pod
  • 容器崩溃
  • ....

4、滚动更新

云原生架构实战03 Kubernetes核心实战_k8s_26

kubectl set image deployment/my-dep nginx=nginx:1.16.1 --record
kubectl rollout status deployment/my-dep

云原生架构实战03 Kubernetes核心实战_k8s_27

升级完成

云原生架构实战03 Kubernetes核心实战_k8s_28


或者以下方式

# 修改 kubectl edit deployment/my-dep

5、版本回退

#历史记录
kubectl rollout history deployment/my-dep


#查看某个历史详情
kubectl rollout history deployment/my-dep --revision=2

#回滚(回到上次)
kubectl rollout undo deployment/my-dep

#回滚(回到指定版本)
kubectl rollout undo deployment/my-dep --to-revision=2

云原生架构实战03 Kubernetes核心实战_k8s_29

云原生架构实战03 Kubernetes核心实战_k8s_30

云原生架构实战03 Kubernetes核心实战_k8s_31

云原生架构实战03 Kubernetes核心实战_k8s_32

更多:

除了Deployment,k8s还有 StatefulSetDaemonSetJob 等 类型资源。我们都称为 工作负载

有状态应用使用 StatefulSet 部署,无状态应用使用 Deployment 部署

https://kubernetes.io/zh/docs/concepts/workloads/controllers/

云原生架构实战03 Kubernetes核心实战_k8s_33


5、Service

云原生架构实战03 Kubernetes核心实战_k8s_34

将一组 Pods 公开为网络服务的抽象方法。

#暴露Deploy
kubectl expose deployment my-dep --port=8000 --target-port=80

#使用标签检索Pod
kubectl get pod -l app=my-dep

云原生架构实战03 Kubernetes核心实战_k8s_35

云原生架构实战03 Kubernetes核心实战_k8s_36

云原生架构实战03 Kubernetes核心实战_k8s_37


或者使用yaml方式

apiVersion: v1
kind: Service
metadata:
  labels:
    app: my-dep
  name: my-dep
spec:
  selector:
    app: my-dep
  ports:
  - port: 8000
    protocol: TCP
    targetPort: 80

云原生架构实战03 Kubernetes核心实战_k8s_38

1、ClusterIP (默认方式)

只能在集群内部访问

# 等同于没有--type的
kubectl expose deployment my-dep --port=8000 --target-port=80 --type=ClusterIP

或者使用yaml实现

apiVersion: v1
kind: Service
metadata:
  labels:
    app: my-dep
  name: my-dep
spec:
  ports:
  - port: 8000
    protocol: TCP
    targetPort: 80
  selector:
    app: my-dep
  type: ClusterIP

云原生架构实战03 Kubernetes核心实战_k8s_39

2、NodePort

云原生架构实战03 Kubernetes核心实战_k8s_40

kubectl expose deployment my-dep --port=8000 --target-port=80 --type=NodePort

NodePort范围在 30000-32767 之间

apiVersion: v1
kind: Service
metadata:
  labels:
    app: my-dep
  name: my-dep
spec:
  ports:
  - port: 8000
    protocol: TCP
    targetPort: 80
  selector:
    app: my-dep
  type: NodePort

云原生架构实战03 Kubernetes核心实战_k8s_41

在外部通过浏览器访问  http://192.168.183.134:30428 也能成功

云原生架构实战03 Kubernetes核心实战_k8s_42

6、Ingress

云原生架构实战03 Kubernetes核心实战_k8s_43


1、安装

wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v0.47.0/deploy/static/provider/baremetal/deploy.yaml

#修改镜像
vi deploy.yaml
#将image的值改为如下值:
registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images/ingress-nginx-controller:v0.46.0

# 检查安装的结果
kubectl get pod,svc -n ingress-nginx

# 最后别忘记把svc暴露的端口要放行

使用下面博客文章的yaml安装ingress

https://blog.csdn.net/weixin_43988498/article/details/122792536

然后执行这个yaml 实现安装

kubectl apply -f ingress.yaml

云原生架构实战03 Kubernetes核心实战_k8s_44

kubectl get pod -A 查看ingress容器状态

kubectl get svc -A   看下ingress-controller暴露端口如下


2、使用

http://192.168.183.134:

应用如下的yaml,准备测试环境   test.yaml文件

apiVersion: apps/v1
kind: Deployment
metadata:
  name: hello-server
spec:
  replicas: 2
  selector:
    matchLabels:
      app: hello-server
  template:
    metadata:
      labels:
        app: hello-server
    spec:
      containers:
      - name: hello-server
        image: registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images/hello-server
        ports:
        - containerPort: 9000
---
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx-demo
  name: nginx-demo
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx-demo
  template:
    metadata:
      labels:
        app: nginx-demo
    spec:
      containers:
      - image: nginx
        name: nginx
---
apiVersion: v1
kind: Service
metadata:
  labels:
    app: nginx-demo
  name: nginx-demo
spec:
  selector:
    app: nginx-demo
  ports:
  - port: 8000
    protocol: TCP
    targetPort: 80
---
apiVersion: v1
kind: Service
metadata:
  labels:
    app: hello-server
  name: hello-server
spec:
  selector:
    app: hello-server
  ports:
  - port: 8000
    protocol: TCP
    targetPort: 9000

然后执行应用

kubectl apply -f test.yaml

云原生架构实战03 Kubernetes核心实战_k8s_45

云原生架构实战03 Kubernetes核心实战_k8s_46


搭建的环境如下图

云原生架构实战03 Kubernetes核心实战_k8s_47

云原生架构实战03 Kubernetes核心实战_k8s_48



1、域名访问

Ingress相当于定义一个请求转发规则

apiVersion: networking.k8s.io/v1
kind: Ingress  
metadata:
  name: ingress-host-bar
spec:
  ingressClassName: nginx
  rules:
  - host: "hello.atguigu.com"
    http:
      paths:
      - pathType: Prefix
        path: "/"
        backend:
          service:
            name: hello-server
            port:
              number: 8000
  - host: "demo.atguigu.com"
    http:
      paths:
      - pathType: Prefix
        path: "/nginx"  # 把请求会转给下面的服务,下面的服务一定要能处理这个路径,不能处理就是404
        backend:
          service:
            name: nginx-demo  ## java,比如使用路径重写,去掉前缀nginx
            port:
              number: 8000

云原生架构实战03 Kubernetes核心实战_k8s_49

发现ingress定义了两个转发规则

然后修改本机host文件

云原生架构实战03 Kubernetes核心实战_k8s_50

2、路径重写

apiVersion: networking.k8s.io/v1
kind: Ingress  
metadata:
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$2
  name: ingress-host-bar
spec:
  ingressClassName: nginx
  rules:
  - host: "hello.atguigu.com"
    http:
      paths:
      - pathType: Prefix
        path: "/"
        backend:
          service:
            name: hello-server
            port:
              number: 8000
  - host: "demo.atguigu.com"
    http:
      paths:
      - pathType: Prefix
        path: "/nginx(/|$)(.*)"  # 把请求会转给下面的服务,下面的服务一定要能处理这个路径,不能处理就是404
        backend:
          service:
            name: nginx-demo  ## java,比如使用路径重写,去掉前缀nginx
            port:
              number: 8000

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

dBFTbkVLMBge