昨天簡略的介紹了今天會佈署的NATS,雖然NATS Streaming要被棄用了,不過我還是會介紹一下。
之前的安裝全部都是透過k8s基礎的resource編寫yaml,對於管理者來說每一次的配置也許可以透過helm或是kustomize等等方式調整,但是還是不太方便,因此誕生了一種基於固定服務而生的crd 叫operator,接下來將會大量透過operator來管理應用。
NATS operator
從官方的git上寫到配置可以分為只能在單獨的namespace或是整座cluster,基於管理上的方便,我是使用了單獨的namespace的方式,首先建立一個獨立的namespaces
kubectl create ns nats
接著下載官方的兩個yam檔案
https://github.com/nats-io/nats-operator/releases/latest/download/00-prereqs.yaml
https://github.com/nats-io/nats-operator/releases/latest/download/10-deployment.yaml
並將其中的namespace從default修改為nats,然後apply 這兩個resource,就可以透過CRD去擴展NATS instance
apiVersion: nats.io/v1alpha2
kind: NatsCluster
metadata:
name: ithome-nats-cluster
spec:
size: 3
version: "1.3.0"
透過同樣的方式取得nats streaming的CRD
https://raw.githubusercontent.com/nats-io/nats-streaming-operator/main/deploy/default-rbac.yaml
https://raw.githubusercontent.com/nats-io/nats-streaming-operator/main/deploy/deployment.yaml
apiVersion: nats.io/v1alpha2
kind: NatsCluster
metadata:
name: stan-nats
spec:
size: 3
version: "1.3.0"
and
apiVersion: streaming.nats.io/v1alpha1
kind: NatsStreamingCluster
metadata:
name: ithome-stan-cluster
spec:
natsSvc: stan-nats
config:
storeDir: /pv/stan
template:
spec:
volumes:
- name: stan-store-dir
persistentVolumeClaim:
claimName: streaming-pvc
containers:
- name: nats-streaming
volumeMounts:
- mountPath: /pv
name: stan-store-dir
pv和pvc則是另外準備好,就會自動創出對應的nats streaming cluster囉
接著來試試看jetstream 吧,由於jetstream也是以NATS為核心,所以依舊要有NATS,為了不要跟上面搞混,所以用另一個namespace nack
https://raw.githubusercontent.com/nats-io/k8s/master/nats-server/nats-js-leaf.yml
調整sts的volume設定
https://raw.githubusercontent.com/nats-io/nack/main/deploy/crds.yml
https://raw.githubusercontent.com/nats-io/nack/main/deploy/rbac.yml
https://raw.githubusercontent.com/nats-io/nack/main/deploy/deployment.yml
並修改一些namespace參數和nats服務的連線設定
接著透過示例做出stream跟push、pull的consumer來嘗試使用NATS服務。
---
apiVersion: jetstream.nats.io/v1beta1
kind: Stream
metadata:
name: mystream
spec:
name: mystream
subjects: ["orders.*"]
storage: memory
maxAge: 1h
---
apiVersion: jetstream.nats.io/v1beta1
kind: Consumer
metadata:
name: my-push-consumer
spec:
streamName: mystream
durableName: my-push-consumer
deliverSubject: my-push-consumer.orders
deliverPolicy: last
ackPolicy: none
replayPolicy: instant
---
apiVersion: jetstream.nats.io/v1beta1
kind: Consumer
metadata:
name: my-pull-consumer
spec:
streamName: mystream
durableName: my-pull-consumer
deliverPolicy: all
filterSubject: orders.received
maxDeliver: 20
ackPolicy: explicit
全部建置完成後,現在我們可以使用的nats如下
這樣就可以來玩nats囉。