1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        GitOps 持續(xù)部署工具 Argo CD 初體驗(yàn)

        共 19174字,需瀏覽 39分鐘

         ·

        2021-07-05 14:27

        Argo CD 是一個(gè)為 Kubernetes 而生的,遵循聲明式 GitOps 理念的持續(xù)部署工具。Argo CD 可在 Git 存儲(chǔ)庫(kù)更改時(shí)自動(dòng)同步和部署應(yīng)用程序。

        Argo CD 遵循 GitOps 模式,使用 Git 倉(cāng)庫(kù)作為定義所需應(yīng)用程序狀態(tài)的真實(shí)來(lái)源,Argo CD 支持多種 Kubernetes 清單:

        • kustomize
        • helm charts
        • ksonnet applications
        • jsonnet files
        • Plain directory of YAML/json manifests
        • Any custom config management tool configured as a config management plugin

        Argo CD 可在指定的目標(biāo)環(huán)境中自動(dòng)部署所需的應(yīng)用程序狀態(tài),應(yīng)用程序部署可以在 Git 提交時(shí)跟蹤對(duì)分支、標(biāo)簽的更新,或固定到清單的指定版本。

        架構(gòu)

        ArgoCD架構(gòu)

        Argo CD 是通過(guò)一個(gè) Kubernetes 控制器來(lái)實(shí)現(xiàn)的,它持續(xù) watch 正在運(yùn)行的應(yīng)用程序并將當(dāng)前的實(shí)時(shí)狀態(tài)與所需的目標(biāo)狀態(tài)( Git 存儲(chǔ)庫(kù)中指定的)進(jìn)行比較。已經(jīng)部署的應(yīng)用程序的實(shí)際狀態(tài)與目標(biāo)狀態(tài)有差異,則被認(rèn)為是 OutOfSync 狀態(tài),Argo CD 會(huì)報(bào)告顯示這些差異,同時(shí)提供工具來(lái)自動(dòng)或手動(dòng)將狀態(tài)同步到期望的目標(biāo)狀態(tài)。在 Git 倉(cāng)庫(kù)中對(duì)期望目標(biāo)狀態(tài)所做的任何修改都可以自動(dòng)應(yīng)用反饋到指定的目標(biāo)環(huán)境中去。

        下面簡(jiǎn)單介紹下 Argo CD 中的幾個(gè)主要組件:

        API 服務(wù):API 服務(wù)是一個(gè) gRPC/REST 服務(wù),它暴露了 Web UI、CLI 和 CI/CD 系統(tǒng)使用的接口,主要有以下幾個(gè)功能:

        • 應(yīng)用程序管理和狀態(tài)報(bào)告
        • 執(zhí)行應(yīng)用程序操作(例如同步、回滾、用戶定義的操作)
        • 存儲(chǔ)倉(cāng)庫(kù)和集群憑據(jù)管理(存儲(chǔ)為 K8S Secrets 對(duì)象)
        • 認(rèn)證和授權(quán)給外部身份提供者
        • RBAC
        • Git webhook 事件的偵聽器/轉(zhuǎn)發(fā)器

        倉(cāng)庫(kù)服務(wù):存儲(chǔ)倉(cāng)庫(kù)服務(wù)是一個(gè)內(nèi)部服務(wù),負(fù)責(zé)維護(hù)保存應(yīng)用程序清單 Git 倉(cāng)庫(kù)的本地緩存。當(dāng)提供以下輸入時(shí),它負(fù)責(zé)生成并返回 Kubernetes 清單:

        • 存儲(chǔ) URL
        • revision 版本(commit、tag、branch)
        • 應(yīng)用路徑
        • 模板配置:參數(shù)、ksonnet 環(huán)境、helm values.yaml 等

        應(yīng)用控制器:應(yīng)用控制器是一個(gè) Kubernetes 控制器,它持續(xù) watch 正在運(yùn)行的應(yīng)用程序并將當(dāng)前的實(shí)時(shí)狀態(tài)與所期望的目標(biāo)狀態(tài)( repo 中指定的)進(jìn)行比較。它檢測(cè)應(yīng)用程序的 OutOfSync 狀態(tài),并采取一些措施來(lái)同步狀態(tài),它負(fù)責(zé)調(diào)用任何用戶定義的生命周期事件的鉤子(PreSync、Sync、PostSync)。

        功能

        • 自動(dòng)部署應(yīng)用程序到指定的目標(biāo)環(huán)境
        • 支持多種配置管理/模板工具(Kustomize、Helm、Ksonnet、Jsonnet、plain-YAML)
        • 能夠管理和部署到多個(gè)集群
        • SSO 集成(OIDC、OAuth2、LDAP、SAML 2.0、GitHub、GitLab、Microsoft、LinkedIn)
        • 用于授權(quán)的多租戶和 RBAC 策略
        • 回滾/隨時(shí)回滾到 Git 存儲(chǔ)庫(kù)中提交的任何應(yīng)用配置
        • 應(yīng)用資源的健康狀況分析
        • 自動(dòng)配置檢測(cè)和可視化
        • 自動(dòng)或手動(dòng)將應(yīng)用程序同步到所需狀態(tài)
        • 提供應(yīng)用程序活動(dòng)實(shí)時(shí)視圖的 Web UI
        • 用于自動(dòng)化和 CI 集成的 CLI
        • Webhook 集成(GitHub、BitBucket、GitLab)
        • 用于自動(dòng)化的 AccessTokens
        • PreSync、Sync、PostSync Hooks,以支持復(fù)雜的應(yīng)用程序部署(例如藍(lán)/綠和金絲雀發(fā)布)
        • 應(yīng)用程序事件和 API 調(diào)用的審計(jì)
        • Prometheus 監(jiān)控指標(biāo)
        • 用于覆蓋 Git 中的 ksonnet/helm 參數(shù)

        核心概念

        • Application:應(yīng)用,一組由資源清單定義的 Kubernetes 資源,這是一個(gè) CRD 資源對(duì)象
        • Application source type:用來(lái)構(gòu)建應(yīng)用的工具
        • Target state:目標(biāo)狀態(tài),指應(yīng)用程序所需的期望狀態(tài),由 Git 存儲(chǔ)庫(kù)中的文件表示
        • Live state:實(shí)時(shí)狀態(tài),指應(yīng)用程序?qū)崟r(shí)的狀態(tài),比如部署了哪些 Pods 等真實(shí)狀態(tài)
        • Sync status:同步狀態(tài)表示實(shí)時(shí)狀態(tài)是否與目標(biāo)狀態(tài)一致,部署的應(yīng)用是否與 Git 所描述的一樣?
        • Sync:同步指將應(yīng)用程序遷移到其目標(biāo)狀態(tài)的過(guò)程,比如通過(guò)對(duì) Kubernetes 集群應(yīng)用變更
        • Sync operation status:同步操作狀態(tài)指的是同步是否成功
        • Refresh:刷新是指將 Git 中的最新代碼與實(shí)時(shí)狀態(tài)進(jìn)行比較,弄清楚有什么不同
        • Health:應(yīng)用程序的健康狀況,它是否正常運(yùn)行?能否為請(qǐng)求提供服務(wù)?
        • Tool:工具指從文件目錄創(chuàng)建清單的工具,例如 Kustomize 或 Ksonnet 等
        • Configuration management tool:配置管理工具
        • Configuration management plugin:配置管理插件

        安裝

        當(dāng)然前提是需要有一個(gè) kubectl 可訪問(wèn)的 Kubernetes 的集群,直接使用下面的命令即可,這里我們安裝最新的穩(wěn)定版 v2.0.4:

        kubectl create namespace argocd
        kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/v2.0.4/manifests/install.yaml

        如果你要用在生產(chǎn)環(huán)境,則可以使用下面的命令部署一個(gè) HA 高可用的版本:

        kubectl create namespace argocd
        kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/v2.0.4/manifests/ha/install.yaml

        這將創(chuàng)建一個(gè)新的命名空間 argocd,Argo CD 的服務(wù)和應(yīng)用資源都將部署到該命名空間。

        $ kubectl get pods -n argocd
        NAME                                  READY   STATUS    RESTARTS   AGE
        argocd-application-controller-0       1/1     Running   0          15m
        argocd-dex-server-76ff776f97-ds7mm    1/1     Running   0          15m
        argocd-redis-747b678f89-w99wf         1/1     Running   0          15m
        argocd-repo-server-6fc4456c89-586zl   1/1     Running   0          15m
        argocd-server-7d57bc994b-kkwsd        1/1     Running   0          15m

        如果你對(duì) UI、SSO、多集群管理這些特性不感興趣,只想把應(yīng)用變更同步到集群中,那么你可以使用 --disable-auth 標(biāo)志來(lái)禁用認(rèn)證,可以通過(guò)命令 kubectl patch deploy argocd-server -n argocd -p '[{"op": "add", "path": "/spec/template/spec/containers/0/command/-", "value": "--disable-auth"}]' --type json 來(lái)實(shí)現(xiàn)。

        然后我們可以在本地安裝 CLI 工具方便操作 Argo CD,我們可以在 Argo CD Git 倉(cāng)庫(kù)發(fā)布頁(yè)面(https://github.com/argoproj/argo-cd/releases/latest)查看最新版本的 Argo CD 或運(yùn)行以下命令來(lái)獲取版本:

        VERSION=$(curl --silent "https://api.github.com/repos/argoproj/argo-cd/releases/latest" | grep '"tag_name"' | sed -E 's/.*"([^"]+)".*/\1/')

        VERSION 在下面的命令中替換為你要下載的 Argo CD 版本:

        curl -sSL -o /usr/local/bin/argocd https://github.com/argoproj/argo-cd/releases/download/$VERSION/argocd-linux-amd64

        為 argocd CLI 賦予可執(zhí)行權(quán)限:

        $ chmod +x /usr/local/bin/argocd
        $ argocd version
        argocd: v2.0.4+0842d44
          BuildDate: 2021-06-23T01:29:55Z
          GitCommit: 0842d448107eb1397b251e63ec4d4bc1b4efdd6e
          GitTreeState: clean
          GoVersion: go1.16
          Compiler: gc
          Platform: darwin/amd64
        argocd-server: v2.0.4+0842d44
          BuildDate: 2021-06-23T01:27:53Z
          GitCommit: 0842d448107eb1397b251e63ec4d4bc1b4efdd6e
          GitTreeState: clean
          GoVersion: go1.16
          Compiler: gc
          Platform: linux/amd64
          Ksonnet Version: v0.13.1
          Kustomize Version: v3.9.4 2021-02-09T19:22:10Z
          Helm Version: v3.5.1+g32c2223
          Kubectl Version: v0.20.4
          Jsonnet Version: v0.17.0

        現(xiàn)在我們就可以使用 argocd 命令了。

        如果你是 Mac,則可以直接使用 brew install argocd 進(jìn)行安裝。

        Argo CD 會(huì)運(yùn)行一個(gè) gRPC 服務(wù)(由 CLI 使用)和 HTTP/HTTPS 服務(wù)(由 UI 使用),這兩種協(xié)議都由 argocd-server 服務(wù)在以下端口進(jìn)行暴露:

        • 443 - gRPC/HTTPS
        • 80 - HTTP(重定向到 HTTPS)

        我們可以通過(guò)配置 Ingress 的方式來(lái)對(duì)外暴露服務(wù),這里我們?nèi)匀皇褂?Traefik 的 IngressRoute 進(jìn)行配置,其他 Ingress 控制器的配置可以參考官方文檔 https://argo-cd.readthedocs.io/en/stable/operator-manual/ingress/ 進(jìn)行配置。

        由于 Traefik 它可以在同一端口處理 TCP 和 HTTP 連接,所以我們不需要定義多個(gè) IngressRoute 來(lái)暴露 HTTP 和 gRPC 服務(wù),然后應(yīng)在禁用 TLS 的情況下運(yùn)行 API 服務(wù),編輯 argocd-server Deployment 以將 --insecure 標(biāo)志添加到 argocd-server 命令中:

        spec:
          template:
            spec:
              containers:
              - name: argocd-server
                command:
                - argocd-server
                - --staticassets
                - /shared/app
                - --repo-server
                - argocd-repo-server:8081
                - --insecure  # 需要禁用 tls,否則會(huì) `redirected you too many times`

        然后創(chuàng)建如下所的 IngressRoute 資源對(duì)象即可,我們創(chuàng)建了一個(gè) redirect-https 的中間件,可以讓 http 服務(wù)強(qiáng)制跳轉(zhuǎn)到 https 服務(wù)去:

        apiVersion: traefik.containo.us/v1alpha1
        kind: Middleware
        metadata:
          name: redirect-https
          namespace: argocd
        spec:
          redirectScheme:
            scheme: https
        ---
        apiVersion: traefik.containo.us/v1alpha1
        kind: IngressRoute
        metadata:
          name: argocd-server-http
          namespace: argocd
        spec:
          entryPoints:
            - web
          routes:
            - kind: Rule
              match: Host(`argocd.k8s.local`)
              priority: 10
              middlewares:
                - name: redirect-https
              services:
                - name: argocd-server
                  port: 80
            - kind: Rule
              match: Host(`argocd.k8s.local`) && Headers(`Content-Type`, `application/grpc`)
              priority: 11
              middlewares:
                - name: redirect-https
              services:
                - name: argocd-server
                  port: 80
                  scheme: h2c
        ---
        apiVersion: traefik.containo.us/v1alpha1
        kind: IngressRoute
        metadata:
          name: argocd-server
          namespace: argocd
        spec:
          entryPoints:
            - websecure
          routes:
            - kind: Rule
              match: Host(`argocd.k8s.local`)
              priority: 10
              services:
                - name: argocd-server
                  port: 80
            - kind: Rule
              match: Host(`argocd.k8s.local`) && Headers(`Content-Type`, `application/grpc`)
              priority: 11
              services:
                - name: argocd-server
                  port: 80
                  scheme: h2c
          tls:
            certResolver: default
            options: {}

        創(chuàng)建完成后,我們就可以通過(guò) argocd.k8s.local 來(lái)訪問(wèn) Argo CD 服務(wù)了,不過(guò)需要注意我們這里配置的證書是自簽名的,所以在第一次訪問(wèn)的時(shí)候會(huì)提示不安全,強(qiáng)制跳轉(zhuǎn)即可:

        argocd ui

        默認(rèn)情況下 admin 帳號(hào)的初始密碼是自動(dòng)生成的,會(huì)以明文的形式存儲(chǔ)在 Argo CD 安裝的命名空間中名為 password 的 Secret 對(duì)象下的 argocd-initial-admin-secret 字段下,我們可以用下面的命令來(lái)獲取:

        kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d && echo

        使用用戶名 admin 和上面輸出的密碼即可登錄 Dashboard,同樣我們也可以通過(guò) ArgoCD CLI 命令行工具進(jìn)行登錄:

        $ argocd login argocd.k8s.local

        WARNING: server certificate had error: x509: certificate is valid for e2d1e856c987c94f3c918276921a61ba.6a98e1283291d1b7a23d19e240b6ee89.traefik.default, not argocd.k8s.local. Proceed insecurely (y/n)? y
        Username: admin
        Password:
        'admin:login' logged in successfully
        Context 'argocd.k8s.local' updated

        CLI 登錄成功后,可以使用如下所示命令更改密碼:

        $ argocd account update-password
        *** Enter current password:
        *** Enter new password:
        *** Confirm new password:
        Password updated
        Context 'argocd.k8s.local' updated

        配置集群

        由于 Argo CD 支持部署應(yīng)用到多集群,所以如果你要將應(yīng)用部署到外部集群的時(shí)候,需要先將外部集群的認(rèn)證信息注冊(cè)到 Argo CD 中,如果是在內(nèi)部部署(運(yùn)行 Argo CD 的同一個(gè)集群,默認(rèn)不需要配置),應(yīng)該使用 https://kubernetes.default.svc 作為應(yīng)用的 K8S APIServer 地址。

        首先列出當(dāng)前 kubeconfig 中的所有集群上下文:

        kubectl config get-contexts -o name

        從列表中選擇一個(gè)上下文名稱并將其提供給 argocd cluster add CONTEXTNAME,比如對(duì)于 docker-desktop上下文,運(yùn)行:

        argocd cluster add docker-desktop

        上述命令會(huì)將 ServiceAccount (argocd-manager) 安裝到該 kubectl 上下文的 kube-system 命名空間中,并將 ServiceAccount 綁定到管理員級(jí)別的 ClusterRole,Argo CD 使用此 ServiceAccount 令牌來(lái)執(zhí)行任務(wù)管理(部署/監(jiān)控)。

        argocd-manager-role 可以修改 Role 的規(guī)則,使其僅對(duì)有限的一組命名空間、組、種類具有 create、update、patch、delete 等權(quán)限,但是對(duì)于 Argo CD 需要 get,list,watch 的權(quán)限在 ClusterRole 范圍內(nèi)。

        創(chuàng)建應(yīng)用

        Git 倉(cāng)庫(kù) https://github.com/argoproj/argocd-example-apps.git 是一個(gè)包含留言簿應(yīng)用程序的示例庫(kù),我們可以用該應(yīng)用來(lái)演示 Argo CD 的工作原理。

        通過(guò) CLI 創(chuàng)建應(yīng)用

        我們可以通過(guò) argocd app create xxx 命令來(lái)創(chuàng)建一個(gè)應(yīng)用:

        $ argocd app create --help
        Create an application

        Usage:
          argocd app create APPNAME [flags]

        Examples:

                # Create a directory app
                argocd app create guestbook --repo https://github.com/argoproj/argocd-example-apps.git --path guestbook --dest-namespace default --dest-server https://kubernetes.default.svc --directory-recurse

                # Create a Jsonnet app
                argocd app create jsonnet-guestbook --repo https://github.com/argoproj/argocd-example-apps.git --path jsonnet-guestbook --dest-namespace default --dest-server https://kubernetes.default.svc --jsonnet-ext-str replicas=2

                # Create a Helm app
                argocd app create helm-guestbook --repo https://github.com/argoproj/argocd-example-apps.git --path helm-guestbook --dest-namespace default --dest-server https://kubernetes.default.svc --helm-set replicaCount=2

                # Create a Helm app from a Helm repo
                argocd app create nginx-ingress --repo https://kubernetes-charts.storage.googleapis.com --helm-chart nginx-ingress --revision 1.24.3 --dest-namespace default --dest-server https://kubernetes.default.svc

                # Create a Kustomize app
                argocd app create kustomize-guestbook --repo https://github.com/argoproj/argocd-example-apps.git --path kustomize-guestbook --dest-namespace default --dest-server https://kubernetes.default.svc --kustomize-image gcr.io/heptio-images/ks-guestbook-demo:0.1

                # Create a app using a custom tool:
                argocd app create ksane --repo https://github.com/argoproj/argocd-example-apps.git --path plugins/kasane --dest-namespace default --dest-server https://kubernetes.default.svc --config-management-plugin kasane


        Flags:
        ......

        直接執(zhí)行如下所示命令即可:

        $ argocd app create guestbook --repo https://github.com/argoproj/argocd-example-apps.git --path guestbook --dest-server https://kubernetes.default.svc --dest-namespace default
        application 'guestbook' created

        通過(guò) UI 創(chuàng)建應(yīng)用

        除了可以通過(guò) CLI 工具來(lái)創(chuàng)建應(yīng)用,我們也可以通過(guò) UI 界面來(lái)創(chuàng)建,定位到 argocd.k8s.local 頁(yè)面,登錄后,點(diǎn)擊 +New App 新建應(yīng)用按鈕,如下圖:

        New App

        將應(yīng)用命名為 guestbook,使用 default project,并將同步策略設(shè)置為 Manual

        配置應(yīng)用

        然后在下面配置 Repository URL 為 https://github.com/argoproj/argocd-example-apps.git,由于某些原因我們這里使用遷移到 Gitee 上面的倉(cāng)庫(kù)地址 https://gitee.com/cnych/argocd-example-apps,將 Revision 設(shè)置為 HEAD,并將路徑設(shè)置為 guestbook:

        配置Repo

        然后下面的 Destination 部分,將 cluster 設(shè)置為 in-cluster 和 namespace 為 default:

        配置集群

        填寫完以上信息后,點(diǎn)擊頁(yè)面上方的 Create 安裝,即可創(chuàng)建 guestbook 應(yīng)用,創(chuàng)建完成后可以看到當(dāng)前應(yīng)用的處于 OutOfSync 狀態(tài):

        guestbook application

        部署應(yīng)用

        由于上面我們?cè)趧?chuàng)建應(yīng)用的時(shí)候使用的同步策略為 Manual,所以應(yīng)用創(chuàng)建完成后沒(méi)有自動(dòng)部署,需要我們手動(dòng)去部署應(yīng)用。同樣可以通過(guò) CLI 和 UI 界面兩種同步方式。

        使用 CLI 同步

        應(yīng)用創(chuàng)建完成后,我們可以通過(guò)如下所示命令查看其狀態(tài):

        $ argocd app get guestbook
        Name:               guestbook
        Project:            default
        Server:             https://kubernetes.default.svc
        Namespace:          default
        URL:                https://argocd.k8s.local/applications/guestbook
        Repo:               https://gitee.com/cnych/argocd-example-apps
        Target:             HEAD
        Path:               guestbook
        SyncWindow:         Sync Allowed
        Sync Policy:        <none>
        Sync Status:        OutOfSync from HEAD (53e28ff)
        Health Status:      Missing

        GROUP  KIND        NAMESPACE  NAME          STATUS     HEALTH   HOOK  MESSAGE
               Service     default    guestbook-ui  OutOfSync  Missing
        apps   Deployment  default    guestbook-ui  OutOfSync  Missing

        應(yīng)用程序狀態(tài)為初始 OutOfSync 狀態(tài),因?yàn)閼?yīng)用程序尚未部署,并且尚未創(chuàng)建任何 Kubernetes 資源。要同步(部署)應(yīng)用程序,可以執(zhí)行如下所示命令:

        argocd app sync guestbook

        此命令從 Git 倉(cāng)庫(kù)中檢索資源清單并執(zhí)行 kubectl apply 部署應(yīng)用,執(zhí)行上面命令后 guestbook 應(yīng)用便會(huì)運(yùn)行在集群中了,現(xiàn)在我們就可以查看其資源組件、日志、事件和評(píng)估其健康狀態(tài)了。

        通過(guò) UI 同步

        直接添加 UI 界面上應(yīng)用的 Sync 按鈕即可開始同步:

        sync 操作

        同步完成后可以看到我們的資源狀態(tài):

        Sync 完成

        還可以有不同的視角進(jìn)行查看:

        Sync 完成

        也可以通過(guò) kubectl 查看到我們部署的資源:

        ?  ~ kubectl get pods
        NAME                                      READY   STATUS      RESTARTS   AGE
        guestbook-ui-6c96fb4bdc-nmk9b             1/1     Running     0          2m22s
        ?  ~ kubectl get svc
        NAME                 TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
        guestbook-ui         ClusterIP   10.96.32.11     <none>        80/TCP     11m
        kubernetes           ClusterIP   10.96.0.1       <none>        443/TCP    41d

        和我們從 Git 倉(cāng)庫(kù)中同步 guestbook 目錄下面的資源狀態(tài)也是同步的,證明同步成功了。

        期望狀態(tài)

        接下來(lái)我們?cè)賮?lái)講解 Argo CD 的實(shí)踐,敬請(qǐng)期待!


        明日公開課預(yù)告


         點(diǎn)擊屏末  | 即刻學(xué)習(xí)


        掃描二維碼獲取

        更多云原生知識(shí)





        k8s 技術(shù)圈





        瀏覽 64
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            国内一区二区在线观看 | 国产一线天在线观看 | 成人综合影视 | 国产成人无码区免费AV片在线 | 偷拍一级片| 18国产一二三精品国产 | 丁香婷婷五月激情综合 | 亚洲逼网| 操色逼网站 | 丝袜调教一区二区 |