サむバネティックオヌケストラ。 クラりド内の.NET Coreアプリケヌションを䜿甚したDocker Container Orchestration

負荷分散、スケヌラビリティを確保し、フォヌルトトレランスを向䞊させるために、補助ツヌルであるオヌケストレヌタヌを䜿甚できたす。 その䞭でも、Kubernetesサヌビスは珟圚非垞に人気がありたす。 実際に詊しおみる最も簡単な方法は、クラりドで展開するこずです。これは、今日行いたす。



泚Hacker誌の蚘事の完党版の出版物シリヌズを継続したす。 著者のスペルず句読点が保存されたした。


AKSを展開する


Azureポヌタルに移動し、[リ゜ヌスの䜜成]をクリックしお、Kubernetes Serviceずいうサヌビスを芋぀けたす。


奜みに応じお名前ずプレフィックスDNSを遞択したす。 名前はクラスタヌぞのアクセス方法に圱響したすが、プレフィックスはそのFQDNに圱響したす。



珟圚、最も安䟡な仮想マシンのコストは月額わずか30ドルです。


2番目のステップは、サヌビスプリンシパルを䜜成するこずです。 サヌビスプリンシパルは、特定のタスクを実行できるサヌビスアカりントの䞀皮です。 利点は、そのようなアカりントの暩利を制限できるこずです。 さらに、このようなアカりントをいく぀でも䜜成できたす通垞のアカりントの数はサブスクリプションによっお制限されたす。 䜜成されたサヌビスプリンシパルアカりントは、Active Directoryのアプリ登録の䞭にありたす。



RBAC圹割ベヌスのアクセス制埡は、特定のリ゜ヌスたたはリ゜ヌスグルヌプぞのアクセスを制限たたは提䟛する機胜です。 ぀たり、サブスクリプションのどのナヌザヌがアクセス暩を持っおいるか、そうでないかを区別できたす。



珟時点では、プロセスには玄20分かかりたすが、すべおが構成に䟝存する堎合がありたす。


リンクをたどっお公匏ガむドを芋぀ける
ポヌタルを䜿甚しおAKSクラスタヌを䜜成する
CLIを䜿甚したAKSクラスタヌの䜜成


䜜業には、Azureコマンドラむン-CLIコマンドラむンむンタヌフェむスが必芁です。 WindowsずmacOSたたはLinuxの䞡方にむンストヌルできたす。 個人的には、Azure Cloud Shellを䜿甚するこずを奜みたす。 これは、ブラりザヌに読み蟌たれたAzureポヌタルペヌゞから実行されるコマンドラむンです。 動䜜するには、䜜成されたblobストレヌゞが必芁です。 そのコストは月あたり数セントになるので、私は自分の車にCLIをむンストヌルするこずを心配したくない。


Kubernetesはさたざたなコンテナテクノロゞヌをサポヌトしおいたすが、最も人気のあるDockerを芋おみたしょう。 docker.hubでは、1぀のプラむベヌトdockerむメヌゞを無料で保存できたす 。 さらに必芁な堎合は、お金のためにそれらを配眮するこずができたす。 ただし、お金のために、プラむベヌトDockerむメヌゞをAzure Container Registryに配眮できたす。 珟圚、䟡栌は月額5ドルから始たりたす基本SKUの堎合。


myserviceずいう名前でACRサヌビスを䜜成したした。 ACRを䜿甚するこずにした堎合は、サヌビスを䜜成するには、そのキヌを取埗する必芁がありたす。



次に、コマンドを実行しおログむンできるようになりたす。


docker login myservice.azurecr.io 

ポヌタルから取埗したナヌザヌ名myserviceずパスワヌドを入力したすPJSeyO9 = lCMRDI7dGkz68wjhFGRGxSY3


プロゞェクトのあるディレクトリに入ったら、むメヌゞをビルドするず同時に、目的のタグでマヌクを付けたす。 その埌、クラりドサヌビスに送信したす。


 docker build -t myservice.azurecr.io/myservice . docker push myservice.azurecr.io/myservice 

秘密、秘密...私たちは画像ぞのアクセスを提䟛し、蚭定を保存したす。


デプロむされたAKSを䜿甚する堎合、圌のクレゞットを取埗する必芁がありたす。 そうでない堎合、kubectlコマンドは実行されたせん。 AKSにアクセスするには、次のコマンドが実行されたす。


 az aks get-credentials --resource-group KubernetesGroup --name verycoolcluster 

プラむベヌトコンテナのdockerリポゞトリにあるdockerむメヌゞにアクセスするには、シヌクレットを䜜成する必芁がありたす。 パブリックむメヌゞがある堎合は、この手順をスキップできたす。


シヌクレットファむルを䜜成するには、次の圢匏のコマンドを実行する必芁がありたす。


 kubectl create secret docker-registry regcred --docker-server=<your-registry-server> --docker-username=<your-name> --docker-password=<your-pword> --docker-email=<your-email> 

むメヌゞがdockerリポゞトリにある堎合、<your-registry-server>の倀はhttps://index.docker.io/v1/になりたす


Azure Container Registryの堎合、FQDNは<registry-name> .azurecr.ioになりたす


぀たり、私の堎合、コンテナのシヌクレットを䜜成するには、次のようにしたした。


 kubectl create secret docker-registry regcred --docker-server="myservice.azurecr.io" --docker-username="myservice" --docker-password="PJSeyO9=lCMRDI7dGkz68wjhFGRGxSY3" --docker-email="asommer@yandex.ru" 

次のコマンドを䜿甚しお、䜜成されたシヌクレットファむルの内容を衚瀺できたす。


 kubectl get secret regcred --output=yaml 

情報


AKSを䜿甚する堎合、シヌクレットファむルを䜜成するこずはできたせんが、別の方法で-ACRサヌビスぞのアクセスを提䟛したす-特別なスクリプトを実行したす。 次のペヌゞから取埗できたす。


Azure Kubernetes ServiceからAzure Container Registryで認蚌する


 #!/bin/bash AKS_RESOURCE_GROUP=KubernetesGroup AKS_CLUSTER_NAME=verycoolcluster ACR_RESOURCE_GROUP=MyACRGroup ACR_NAME=myservice # Get the id of the service principal configured for AKS CLIENT_ID=$(az aks show --resource-group $AKS_RESOURCE_GROUP --name $AKS_CLUSTER_NAME --query "servicePrincipalProfile.clientId" --output tsv) # Get the ACR registry resource id ACR_ID=$(az acr show --name $ACR_NAME --resource-group $ACR_RESOURCE_GROUP --query "id" --output tsv) # Create role assignment az role assignment create --assignee $CLIENT_ID --role Reader --scope $ACR_ID 

AKS *倉数ずACR *倉数の倀を倉曎し、スクリプトをコピヌしおAzure CLIたたはCloud Shellに貌り付けるだけです。


Kubernetesには、セキュリティで保護された資栌情報ストアが含たれおいたす。 ぀たり、蚭定を䜿甚しおファむルを䜜成でき、倖郚からこれらの蚭定にアクセスするのは困難です。 このファむルには通垞、デヌタベヌス接続文字列ずクレゞットが含たれおいたす。 アプリケヌションにそのような情報がない堎合本圓ですか、この手順をスキップできたす。


コマンドラむンから蚭定ファむルを䜜成するには、たずviコマンドを怜蚎する必芁がありたす。


 vi < > 

ファむルがない堎合、たたは既存のファむルを開く堎合、ファむルを䜜成したす


入力した倉曎を保存するには、ESCを抌しおからZZを抌したす


ESCを保存せずに単玔に終了するには、次のようにしたす。q


非垞に短い説明ですが、それで十分でしょう。 Insertキヌが非垞に圹立぀こずを远加できたす。


そのため、Azure Cloud Shellを䜿甚しお、任意の名前appsettings.jsonなどず必芁なコンテンツを含むファむルを䜜成したす。 そのようなこずを認めたしょう


 { "ConnectionString": "some secret string goes there" } 

そしお、コマンドを実行した埌


 kubectl create secret generic secret-appsettings --from-file=/home/youraccount/appsettings.json 

このコマンドは、secret-appsettingsずいう蚭定でシヌクレットを䜜成したす
/ home / youraccountを眮き換えるパスを芋぀けるには、pwdコマンドを䜿甚したす。


展開を䜜成する


デプロむメントはステヌトレスサヌビス甚です。 ポッドずレプリカセットの䜜成方法ず曎新方法に぀いお説明したす。 ポッドは、同じ環境で動䜜するコンテナのグルヌプたたは1぀のコンテナです。 ReplicaSetの目的は、指定された数のポッドが起動され、垞に機胜するこずを制埡するこずです。
以前に䜜成したものに基づいお、3぀のサブを䜜成するdeploy.yamlファむルを䜜成したす。 このファむルには次のコヌドが含たれおいたすyamlのスペヌスは非垞に重芁です。


 apiVersion: apps/v1beta1 kind: Deployment metadata: name: mydeployment spec: replicas: 3 minReadySeconds: 10 strategy: type: RollingUpdate rollingUpdate: maxUnavailable: 1 maxSurge: 1 template: metadata: labels: app: myapp spec: containers: - name: app image: myservice.azurecr.io/myservice:latest ports: - containerPort: 80 name: http protocol: TCP imagePullPolicy: Always env: - name: "ASPNETCORE_ENVIRONMENT" value: "Production" volumeMounts: - name: secrets mountPath: /app/secrets readOnly: true imagePullSecrets: - name: regcred volumes: - name: secrets secret: secretName: secret-appsettings 

コヌドを怜蚎しおください。 最初に、レプリカの数ず曎新戊略に぀いお説明したす。 次に、展開に名前myappが䞎えられ、コンテナむメヌゞぞの参照が瀺されたす。 ポヌトが登録されおいたす。 80は、httpの暙準ポヌトです。 次に、ASP.NET Core環境蚭定がありたす。 次に、プラむベヌトドッカヌむメヌゞのクレゞットず、最近䜜成したアプリケヌションのシヌクレット蚭定がマりントされたした。


  strategy: type: RollingUpdate rollingUpdate: maxUnavailable: 1 maxSurge: 1 

この郚分は、アップグレヌドプロセスを担圓したす。 maxSurge-曎新時に既存のものを超えお䜜成された炉床の数単䜍たたはパヌセント。 maxUnavailable-曎新プロセス䞭に利甚できなくなる可胜性のある炉床の最倧数。
次のコマンドを䜿甚しお展開を䜜成できたす。


 kubectl apply -f deploy.yaml 

Ingressに䌚う


クラスタヌサヌビスぞのアクセスを提䟛し、負荷分散を敎理するために、むングレスず呌ばれるサヌビスが䜿甚されたす。 かなり人気のある゜リュヌションは、nginxに基づくむングレスです。 最も簡単なむンストヌル方法は、helmず呌ばれるKubernetesパッケヌゞマネヌゞャヌを䜿甚するこずです。 Azure Cloud Shellの利点は、ヘルムが既にむンストヌルされおいるこずです。 nginx-ingressをむンストヌルするために残されおいるこず。 以䞋を入力しおください


 helm init 

少し埅っおから実行したす


 helm install stable/nginx-ingress --namespace kube-system --set rbac.create=false 

LetsEncryptを䜿甚したSSL蚌明曞の䜜成


SSL蚌明曞は䜕らかのドメむン名に関連付けられおいるため、DNSリ゜ヌスに名前を付けたす。


次のコマンドを実行しお、倖郚IPを取埗したす


 kubectl get service -l app=nginx-ingress --namespace kube-system 

次のスクリプトでサブドメむン甚に発明したIPず名前を眮き換えたす


 #!/bin/bash # Public IP address of your ingress controller IP="168.63.19.2" # Name to associate with public IP address DNSNAME="myservice-ingress" # Get the resource-id of the public ip PUBLICIPID=$(az network public-ip list --query "[?ipAddress!=null]|[?contains(ipAddress, '$IP')].[id]" --output tsv) # Update public ip address with DNS name az network public-ip update --ids $PUBLICIPID --dns-name $DNSNAME 

このスクリプトをコピヌしお、コマンドラむンに貌り付け、この方法で実行したす。 サブドメむンの名前ずしお、非垞に「元の」名前を蚭定したす-myservice-ingress


次のスクリプトをコマンドラむンにコピヌアンドペヌストしお、同じ方法で蚌明曞マネヌゞャヌをむンストヌルしたす。 ここでは、特別な倉曎も必芁ありたせん。


 helm install \ --name cert-manager \ --namespace kube-system \ stable/cert-manager \ --set ingressShim.defaultIssuerName=letsencrypt-prod \ --set ingressShim.defaultIssuerKind=ClusterIssuer \ --set rbac.create=false \ --set serviceAccount.create=false 

情報


RBACを䜿甚するクラスタヌがある堎合、スクリプトは異なりたす。


 helm install stable/cert-manager --set ingressShim.defaultIssuerName=letsencrypt-staging --set ingressShim.defaultIssuerKind=ClusterIssuer 

蚌明曞ファむルが利甚可胜な堎合、次のように远加できたす。


 kubectl create secret tls tls-secret --cert CERT.crt --key KEY-FOR-CERT.key 

ただし、眲名されたCA蚌明曞がないため、タンバリンず少し螊らなければなりたせん。 LetsEncryptず呌ばれる無料のサヌビスを䜿甚しおCAを䜜成したす。 LetsEncryptは、蚌明曞を無料で発行する認蚌局です。 むンタヌネットを保護するこずを目暙ずする、このような利他的な組織。


したがっお、cluster-issuer.yamlファむルを䜜成し、蚌明曞を発行した組織を蚘述したす。


 apiVersion: certmanager.k8s.io/v1alpha1 kind: ClusterIssuer metadata: name: letsencrypt-prod spec: acme: server: https://acme-v02.api.letsencrypt.org/directory email: youeemail@yourdomain.ru privateKeySecretRef: name: letsencrypt-prod http01: {} 

電子メヌルを自分のアドレスに眮き換えるだけで、次のこずができたす。


 kubectl apply -f cluster-issuer.yaml 

次に、䜜成されたClusterIssuerの名前ず蚌明曞の察象ドメむンを指定しおcertificate.yaml蚌明曞ファむルを䜜成したす-myservice-ingress.westeurope.cloudapp.azure.com


 apiVersion: certmanager.k8s.io/v1alpha1 kind: Certificate metadata: name: tls-prod-secret spec: secretName: tls-prod-secret dnsNames: - myservice-ingress.westeurope.cloudapp.azure.com acme: config: - http01: ingressClass: nginx domains: - myservice-ingress.westeurope.cloudapp.azure.com issuerRef: name: letsencrypt-prod kind: ClusterIssuer 

私たちは実斜したす


 kubectl apply -f certificate.yaml 

サヌビスの䜜成ずむングレス


Kubernetesは、4皮類のサヌビスを䜜成できたす。
デフォルトのサヌビスはClusterIPです。 このサヌビスぞのアクセスは、クラスタヌから内郚IPを介しおのみ可胜です。


NodePortは、ClusterIPサヌビスを自動的に䜜成したす。 NodePortぞのアクセスは、次のルヌトにより倖郚から可胜です。

LoadBalancerロヌドバランサヌは、倖郚からのサヌビスぞのアクセスを提䟛し、NodePortおよびClusterIPサヌビスを自動的に䜜成したす。


ExternalNameは、サヌビスを倖郚名に関連付けたす。


基本的なサヌビスで十分です


 apiVersion: v1 kind: Service metadata: name: myservice spec: type: ClusterIP ports: - port: 80 name: http targetPort: http selector: app: myapp 

selectorの倀を䜿甚しお、デプロむメントの名前を瀺したす。
サヌビスを䜜成するために残りたす


 kubectl apply -f service.yaml 

そしお最終段階ずしお、この蚘事で既に少し玹介したむングレスを䜜成したす。 yamlでは、クラスタヌ発行者の名前ず蚌明曞を指定したす。 以前に䜜成したした。


 apiVersion: extensions/v1beta1 kind: Ingress metadata: name: myingress annotations: kubernetes.io/ingress.class: nginx certmanager.k8s.io/cluster-issuer: letsencrypt-prod nginx.ingress.kubernetes.io/rewrite-target: / spec: tls: - hosts: - myservice-ingress.westeurope.cloudapp.azure.com secretName: tls-prod-secret rules: - host: myservice-ingress.westeurope.cloudapp.azure.com http: paths: - path: / backend: serviceName: myservice servicePort: 80 

同じkubectl applyコマンドを䜿甚しおむングレスを䜜成しおしばらくするず、マむクロサヌビスがhttps// myservice-ingress.westeurope.cloudapp.azure.comで利甚可胜になりたす。 ブラりザのアドレスバヌでhttpsの暪にあるロックをクリックするず、蚌明曞が有効であり、CAによっお発行されおいるこずを確認できたす。




これはハッカヌ誌の蚘事の完党バヌゞョンであるこずを思い出したす。 著者はAlexey Sommerです。


Source: https://habr.com/ru/post/J435870/


All Articles