è² è·åæ£ãã¹ã±ãŒã©ããªãã£ã確ä¿ãããã©ãŒã«ããã¬ã©ã³ã¹ãåäžãããããã«ãè£å©ããŒã«ã§ãããªãŒã±ã¹ãã¬ãŒã¿ãŒã䜿çšã§ããŸãã ãã®äžã§ãã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ã§ãã