TOC
前提
在开始之前,你需要以下前提准备.
对于本文来说使用的 K8S 环境是基于 Kind 来搭建的,因此将 Kind 命令写在前提内,但是如果你使用了其他工具搭建 K8S 或已经有 K8S 集群了,那么这是非必须的.
- helm v3
- kubernetes 集群
- Kind (用于搭建 K8S 环境,非必须)
版本信息
本文基于以下环境信息
- kubernetes v1.26.0
- fsm helm chart fsm-0.2.3
Kind 配置文件
对于 Kind 的配置,这里贴出本文所使用的配置文件,同时也提供一个在线地址,因此你可以直接下载配置文件来使用.
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
containerdConfigPatches:
- |-
  [plugins."io.containerd.grpc.v1.cri".registry.mirrors."gcr.io"]
    endpoint = ["https://gcr.lank8s.cn"]
  [plugins."io.containerd.grpc.v1.cri".registry.mirrors."k8s.gcr.io"]
    endpoint = ["https://k8s.lank8s.cn"]
  [plugins."io.containerd.grpc.v1.cri".registry.mirrors."registry.k8s.io"]
    endpoint = ["https://registry.lank8s.cn"]  
部署
部署K8S集群
部署fsm
首先使用 helm 安装 fsm:
helm repo add fsm https://charts.flomesh.io
helm install fsm fsm/fsm --namespace flomesh --create-namespace
顺利的话可以看到 flomesh 这个 namespace 下所有的 pod 都运行起来了.
oem@lan:~$ k get po -n flomesh                                                                                                                                          
NAME                                READY   STATUS    RESTARTS   AGE
fsm-ingress-pipy-65958fd9d6-v46vl   1/1     Running   0          3h15m
fsm-manager-9c7665764-8wcvv         1/1     Running   0          3h15m
fsm-repo-89cb68547-kv94n            1/1     Running   0          3h15m
创建ingress
使用在线文件:
kubectl apply -f https://liangyuanpeng.com/files/flomesh-ingress-quickstart/ingress.yaml
使用下述文件,自行保存下述内容到文件中然后应用:
kubectl apply -f ingress.yaml
ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: httpbin
  labels:
    app: httpbin
    controller: pipy
spec:
  ingressClassName: pipy
  rules:
    - host: lan.local
      http:
        paths:
          - path: /ip
            pathType: Exact
            backend:
              service:
                name: httpbin
                port:
                  number: 80
          - path: /
            pathType: Prefix
            backend:
              service:
                name: httpbin
                port:
                  number: 80
部署后端服务httpbin
使用在线文件:
kubectl apply -f https://liangyuanpeng.com/files/exampleapp/httpbin.yaml
使用下述文件,自行保存下述内容到文件中然后应用:
kubectl apply -f httpbin.yaml
httpbin.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: httpbin
  name: httpbin
spec:
  replicas: 3
  selector:
    matchLabels:
      app: httpbin
  template:
    metadata:
      labels:
        app: httpbin
    spec:
      containers:
        - image: docker.io/kennethreitz/httpbin
          name: httpbin
---
apiVersion: v1
kind: Service
metadata:
  labels:
    app: httpbin
  name: httpbin
spec:
  ports:
    - port: 80
      protocol: TCP
      targetPort: 80
  selector:
    app: httpbin
  sessionAffinity: None
  type: ClusterIP
测试一下!
首先恭喜,你已经安装了 flomesh ingress controller 和 httpbin.
你可以检查一下目前所有 pod 是否都已经准备就绪了:
检查 httpbin 相关内容:
oem@lan:~$ kubectl get po,svc,ing -l app=httpbin
NAME                           READY   STATUS    RESTARTS      AGE
pod/httpbin-749b466b9c-5m54z   1/1     Running   0             7s
pod/httpbin-749b466b9c-7vgh6   1/1     Running   1 (73m ago)   10h
pod/httpbin-749b466b9c-86cgc   1/1     Running   0             7s
NAME              TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
service/httpbin   ClusterIP   10.96.201.220   <none>        80/TCP    11h
NAME                                CLASS   HOSTS       ADDRESS   PORTS   AGE
ingress.networking.k8s.io/httpbin   pipy    lan.local             80      11h
正常来说你会看到上述三个内容:
- 3 个准备就绪的 httpbin 的 pod
- 一个带有 80 端口号的 httpbin svc
- 一个匹配 lan.local 域名并且匹配端口号 80 的一个 ingress
检查 flomesh ingress 相关内容:
oem@lan:~$ kubectl get po -n flomesh
NAME                                READY   STATUS    RESTARTS      AGE
fsm-ingress-pipy-65958fd9d6-v46vl   1/1     Running   1 (75m ago)   14h
fsm-manager-9c7665764-8wcvv         1/1     Running   1 (75m ago)   14h
fsm-repo-89cb68547-kv94n            1/1     Running   1 (75m ago)   14h
正常来说你会看到以下准备就绪的 pod (只检查了 pod 资源):
- fsm-ingress-pipy
- fsm-manager
- fsm-repo
接下来使用kubectl port-forward 来暴露流量进行测试:
kubectl -n flomesh port-forward service/fsm-ingress-pipy-controller 8888:80
来测试一下访问效果:
oem@lan:~$ curl -H "host: lan.local" localhost:8888/ip 
{
  "origin": "10.244.0.4"
}
oem@lan:~$ curl -H "host: lan.local" localhost:8888/headers
{
  "headers": {
    "Accept": "*/*", 
    "Connection": "keep-alive", 
    "Content-Length": "0", 
    "Host": "lan.local", 
    "User-Agent": "curl/7.81.0"
  }
}
如果你也在使用上述示例命令后也能看到类似的结果,那么恭喜你已经成功部署了一个后端应用服务,创建了 ingress 并且基于 flomesh ingress controller 来将流量路由到了后端应用服务.
注意上述示例中为请求添加了 host: lan.local 的 header,与 ingress 中 host 设定的值是一致的,如果你希望使用其他值需要修改成一样的内容.
下一步
在2023年的今天, Gateway API 还处于一个 v1beta1 的版本,但是诸多的 ingress controller 都纷纷跟进,实现了 Gateway API,但是从Gateway API官网看到 fsm 还不支持 Gateway API,显示的状态是 work in progress,意味着开发中,但目前不支持.
期待 fsm 支持 Gateway API 的那一天,然后就可以进行下一步:基于 Gateway API 尝试 FSM 流量管理.
微信公众号
扫描下面的二维码关注我们的微信公众号,第一时间查看最新内容。同时也可以关注我的Github,看看我都在了解什么技术,在页面底部可以找到我的Github。
 
         
                                
                            
                                
                            
                                
                            
                                
                            
                                
                            
                                
                            
                                
                            
                                
                            
                                
                            
                                
                            
                                
                            
                                
                            
                                
                            
                                
                            
                                
                            
                                
                            
                                
                            
                                
                            
                                
                            
                                
                            
                                
                            
                                
                            
                                
                            
                                
                            
                                
                            
                                
                            
                                
                            
                                
                            
                                
                            
                         
                                
                            
                                
                            
                                
                            
                                
                            
                                
                            
                                
                            
                                
                            
                                
                            
                                
                            
                                
                            
                                
                            
                                
                            
                                
                            
                                
                            
                                
                            
                                
                            
                                
                            
                                
                            
                                
                            
                                
                            
                                
                            
                                
                            
                                
                            
                                
                            
                                
                            
                                
                            
                                
                            
                        
