「マイクロソフト系技術情報 Wiki」は、「Open棟梁Project」,「OSSコンソーシアム .NET開発基盤部会」によって運営されています。
「AKSをセキュアに利用する構築デモ」で使ったシェルのコピペ用ページ
以下の点をカスタマイズした。
タイムアウトや、エクステンションの既定値?
の関係で、やっぱ、ローカルで利用したいなぁと。
XXXXXXXXXは置換して利用。
OS_USER_ID=XXXXXXXXX OS_PASSWORD=XXXXXXXXX
az network public-ip create --name uservmX-ip --resource-group $RG_ONP --sku Standard ONP_VNET_SUBNET_DEF_ID=$(az network vnet subnet show --resource-group $RG_ONP --vnet-name $ONP_VNET_NAME --name $ONP_VNET_SUBNET_DEF_NAME --query id -o tsv) az network nic create --name uservmXnic --subnet $ONP_VNET_SUBNET_DEF_ID --resource-group $RG_ONP --location $LOCATION --public-ip-address uservmX-ip
MGMT_LINUX_VM_NAME=mgmt-linux-vmX
MGMT_LINUX_VM_NIC_NAME="${MGMT_LINUX_VM_NAME}-nic"az vm create --name uservmX --image "MicrosoftWindowsDesktop:Windows-10:19h2-ent:18363.720.2003120536" --admin-username $OS_USER_ID --admin-password $OS_PASSWORD --nics uservmXnic --resource-group $RG_ONP --location $LOCATION --size Standard_D2_v3
az vm create --name $MGMT_WIN_VM_NAME --image Win2019Datacenter --admin-username $OS_USER_ID --admin-password $OS_PASSWORD --nics $MGMT_WIN_VM_NIC_NAME --resource-group $RG_AKS --location $LOCATION --size Standard_D2_v3
az vm create --name $MGMT_LINUX_VM_NAME --image UbuntuLTS --admin-username $OS_USER_ID --admin-password $OS_PASSWORD --nics $MGMT_LINUX_VM_NIC_NAME --resource-group $RG_AKS --location $LOCATION --generate-ssh-keys --size Standard_D2_v3
<管理ディスク名>は置換して利用。
az vm create --name uservmX --attach-os-disk <管理ディスク名> --nics uservmXnic --resource-group $RG_ONP --location $LOCATION --size Standard_D4s_v3 --os-type Windows
az vm create --name $MGMT_WIN_VM_NAME --attach-os-disk <管理ディスク名> --nics $MGMT_WIN_VM_NIC_NAME --resource-group $RG_AKS --location $LOCATION --size Standard_D4s_v3 --os-type Windows
※ <管理ディスク名>の準備方法は、この辺を参照。
az vm open-port --resource-group $RG_ONP --name uservmX --port 3389
※ 注意:コチラ
az network firewall application-rule create --firewall-name $FW_NAME --resource-group $RG_AKS \
--collection-name "Required_for_management_Windows_VMs" \
--name "Azure AD Authentication" --source-addresses "${MGMT_WIN_NIC_IP_ADDRESS}/32" --protocols https=443 \
--target-fqdns "login.microsoftonline.com" "aadcdn.msftauth.net" "msft.sts.microsoft.com" "login.live.com"他にもあったら足して行く。
network-rule で dst を any の * にした。
az network firewall application-rule create --firewall-name $FW_NAME --resource-group $RG_AKS --collection-name "Required_for_AKS_clusters" --action "Allow" --priority 200 --name "MCR" --source-addresses "${AKS_VNET_SUBNET_NPS_ADDRESS_PREFIX}" --protocols https=443 --target-fqdns "*.cdn.mscr.io" "mcr.microsoft.com" "*.data.mcr.microsoft.com"
az network firewall application-rule create --firewall-name $FW_NAME --resource-group $RG_AKS --collection-name "Required_for_AKS_clusters" --name "k8s GET PUT operations" --source-addresses "${AKS_VNET_SUBNET_NPS_ADDRESS_PREFIX}" --protocols https=443 --target-fqdns "management.azure.com"
az network firewall application-rule create --firewall-name $FW_NAME --resource-group $RG_AKS --collection-name "Required_for_AKS_clusters" --name "Azure AD authentication" --source-addresses "${AKS_VNET_SUBNET_NPS_ADDRESS_PREFIX}" --protocols https=443 --target-fqdns "login.microsoftonline.com"
az network firewall application-rule create --firewall-name $FW_NAME --resource-group $RG_AKS --collection-name "Required_for_AKS_clusters" --name "apt-get operation for Moby, PowerShell, Azure CLI" --source-addresses "${AKS_VNET_SUBNET_NPS_ADDRESS_PREFIX}" --protocols https=443 --target-fqdns "packages.microsoft.com"
az network firewall application-rule create --firewall-name $FW_NAME --resource-group $RG_AKS --collection-name "Required_for_AKS_clusters" --name "repository for kubenet, Azure CNI" --source-addresses "${AKS_VNET_SUBNET_NPS_ADDRESS_PREFIX}" --protocols https=443 --target-fqdns "acs-mirror.azureedge.net"
az network firewall application-rule create --firewall-name $FW_NAME --resource-group $RG_AKS --collection-name "Optional_for_AKS_clusters" --action "Allow" --priority 300 --name "download security patches for linux nodes" --source-addresses "${AKS_VNET_SUBNET_NPS_ADDRESS_PREFIX}" --protocols http=80 --target-fqdns "security.ubuntu.com" "azure.archive.ubuntu.com" "changelogs.ubuntu.com"
az network firewall application-rule create --firewall-name $FW_NAME --resource-group $RG_AKS --collection-name "Azure_Policy_for_AKS_clusters_preview" --action "Allow" --priority 500 --name "correct metrics and monitoring telemetry" --source-addresses "${AKS_VNET_SUBNET_NPS_ADDRESS_PREFIX}" --protocols https=443 --target-fqdns "gov-prod-policy-data.trafficmanager.net" "raw.githubusercontent.com" "*.gk.${LOCATION}.azmk8s.io" "dc.services.visualstudio.com"
az network firewall application-rule create --firewall-name $FW_NAME --resource-group $RG_AKS --collection-name "Azure_Monitor_for_containers" --action "Allow" --priority 400 --name "Correct data, authentication, for agent" --source-addresses "${AKS_VNET_SUBNET_NPS_ADDRESS_PREFIX}" --protocols https=443 --target-fqdns "dc.services.visualstudio.com" "*.ods.opinsights.azure.com" "*.oms.opinsights.azure.com" "*.microsoftonline.com" "*.monitoring.azure.com"
az network firewall application-rule create --firewall-name $FW_NAME --resource-group $RG_AKS --collection-name "Azure_Monitor_for_containers" --name "kubeapi-proxy" --source-addresses "${AKS_VNET_SUBNET_NPS_ADDRESS_PREFIX}" --protocols https=443 --target-fqdns "aks-kubeapi-proxy-prod.trafficmanager.net"
az network firewall network-rule create --firewall-name $FW_NAME --resource-group $RG_AKS --collection-name "Required_for_AKS_clusters" --action "Allow" --priority 200 --name "NTP time synchronization on Linux nodes" --source-addresses "${AKS_VNET_SUBNET_NPS_ADDRESS_PREFIX}" --protocols "UDP" --destination-addresses "*" --destination-ports 123 az network firewall network-rule create --firewall-name $FW_NAME --resource-group $RG_AKS --collection-name "hoge" --action "Allow" --priority 200 --name "hoge" --source-addresses "${AKS_VNET_SUBNET_NPS_ADDRESS_PREFIX}" --protocols "Any" --destination-addresses "*" --destination-ports "*"MGMT_WIN_NIC_IP_ADDRESS=$(az network nic show --name $MGMT_WIN_VM_NIC_NAME --resource-group $RG_AKS --query ipConfigurations[0].privateIpAddress -o tsv)
az network firewall application-rule create --firewall-name $FW_NAME --resource-group $RG_AKS --collection-name "Required_for_management_Windows_VMs" --action "Allow" --priority 1000 --name "WindowsUpdate" --source-addresses "${MGMT_WIN_NIC_IP_ADDRESS}/32" --protocols http=80 https=443 --fqdn-tags "WindowsUpdate" "WindowsDiagnostics" "MicrosoftActiveProtectionService"MGMT_WIN_NIC_IP_ADDRESS=$(az network nic show --name $MGMT_WIN_VM_NIC_NAME --resource-group $RG_AKS --query ipConfigurations[0].privateIpAddress -o tsv)
az network firewall network-rule create --firewall-name $FW_NAME --resource-group $RG_AKS --collection-name "hogehoge" --action "Allow" --priority 1000 --name "hogehoge" --source-addresses "${MGMT_WIN_NIC_IP_ADDRESS}/32" --protocols "Any" --destination-addresses "*" --destination-ports "*"ゴチャゴチャしているので、コチラの構成に合わせて簡素化した決め打ちのコピペ。
# Create AKS Cluster ============================================== # Prepare for creating cluster AKS_VERSION=$(az aks get-versions --location $LOCATION --query 'orchestrators[?!isPreview] | [-1].orchestratorVersion' --output tsv) AKS_VNET_SUBNET_NPS_ID=$(az network vnet subnet show --resource-group $RG_AKS --vnet-name $AKS_VNET_NAME --name $AKS_VNET_SUBNET_NPS_NAME --query id -o tsv) # Create AKS Cluster ※ 時間がかかる az aks create --resource-group $RG_AKS --name $AKS_CLUSTER_NAME --vm-set-type VirtualMachineScaleSets --load-balancer-sku standard --location $LOCATION --kubernetes-version $AKS_VERSION --network-plugin azure --vnet-subnet-id $AKS_VNET_SUBNET_NPS_ID --service-cidr $AKS_SERVICE_CIDR --dns-service-ip $AKS_DNS_SERVICE_IP --docker-bridge-address 172.17.0.1/16 --generate-ssh-keys --outbound-type userDefinedRouting --enable-private-cluster --enable-managed-identity # VNET に対する Contributor 権限を与える(VNET が管理リソースグループの外にあるため) AKS_VNET_ID=$(az network vnet show --name $AKS_VNET_NAME --resource-group $RG_AKS --query id -o tsv) AKS_MANAGED_ID=$(az aks show --name $AKS_CLUSTER_NAME --resource-group $RG_AKS --query identity.principalId -o tsv) az role assignment create --assignee $AKS_MANAGED_ID --role "Contributor" --scope $AKS_VNET_ID # End of Create AKS Cluster ==============================================
# Configure ACR for connecting from AKS # この作業により、Service Principal に対して ACR の AcrPull ロールが付与される az aks update --name $AKS_CLUSTER_NAME --resource-group $RG_AKS --attach-acr $ACR_NAME
# Azure Monitor for AKS 有効化
DIAG_LA_WS_RESOURCE_ID=$(az monitor log-analytics workspace show --resource-group $RG_OPS --workspace-name $DIAG_LA_WS_NAME --query id -o tsv)
# 以下のエラーが出た場合は、Azure CLI のバージョンを変更してトライしてみる。
# The request content was invalid and could not be deserialized: 'Could not find member 'template' on object of type 'DeploymentDefinition'. Path 'template', line 1, position 12.'.
az aks enable-addons --addons monitoring --name $AKS_CLUSTER_NAME --resource-group $RG_AKS --workspace-resource-id $DIAG_LA_WS_RESOURCE_ID
# AKS 診断設定の有効化
DIAG_STORAGE_ID=$(az storage account show --name $DIAG_STORAGE_NAME --query id -o tsv)
DIAG_LA_WS_ID=$(az monitor log-analytics workspace show --workspace-name $DIAG_LA_WS_NAME --resource-group $RG_OPS --query id -o tsv)
AKS_CLUSTER_ID=$(az aks show --name $AKS_CLUSTER_NAME --resource-group $RG_AKS --query id -o tsv)
az monitor diagnostic-settings create --name $AKS_CLUSTER_NAME --resource $AKS_CLUSTER_ID \
--logs '[{"category": "kube-apiserver","enabled": true},{"category": "kube-audit","enabled": true},{"category": "kube-controller-manager","enabled": true},{"category": "kube-scheduler","enabled": true},{"category": "cluster-autoscaler","enabled": true}]' \
--metrics '[{"category": "AllMetrics","enabled": true}]' \
--storage-account $DIAG_STORAGE_ID --workspace $DIAG_LA_WS_ID
「AKS クラスタをAzure Firewall配下のVNETに配置しようとした場合で、
コレを非プライベート・クラスタとして作成しようとすると、以下な手順が必要になるため。」
です。
置換するところが多いので。
XXXXXXXXXは置換して利用。
rem cmd を開いてホームに移動 az login rem ブラウザが開くのでログイン rem Select Subscription SET SUBSCRIPTION_NAME=XXXXXXXXX az account set -s %SUBSCRIPTION_NAME% rem kubeconfig ファイルを取得 SET NAME_PREFIX=daisukenishino SET RG_AKS=%NAME_PREFIX%-aks-rg SET AKS_CLUSTER_NAME=%NAME_PREFIX%-aks del .kube\config rem clusterAdmin 用のトークン取得 az aks get-credentials --resource-group %RG_AKS% --name %AKS_CLUSTER_NAME% --admin ren .kube\config admin-config rem clusterUser 用のトークン取得 az aks get-credentials --resource-group %RG_AKS% --name %AKS_CLUSTER_NAME%
XXXXXXXXXは置換して利用。
sudo az login
# Select Subscription
SUBSCRIPTION_NAME=XXXXXXXXX
sudo az account set -s "$SUBSCRIPTION_NAME"
SUBSCRIPTION_ID=$(az account show -s "$SUBSCRIPTION_NAME" --query id -o tsv)
NAME_PREFIX=daisukenishino
LOCATION=japaneast
RG_AKS="${NAME_PREFIX}-aks-rg"
AKS_CLUSTER_NAME="${NAME_PREFIX}-aks"
sudo rm .kube/config
sudo az aks get-credentials --resource-group $RG_AKS --name $AKS_CLUSTER_NAME --admin
sudo mv .kube/config .kube/admin-config
sudo az aks get-credentials --resource-group $RG_AKS --name $AKS_CLUSTER_NAME
OS_USER_IDは置換して利用。
rem C:\Users\OS_USER_ID\AzRefArc.SpringBoot 下にファイルを展開 rem .mvn, src. Dockerfile, mvnw などがこのフォルダの直下に来るように rem mgmt-windows-vm1 のコマンドラインから以下を実行 scp -r C:\Users\OS_USER_ID\AzRefArc.SpringBoot OS_USER_ID@mgmt-linux-vm1:/home/OS_USER_ID/
# mgmt-linux-vm1 にログインし、Docker コンテナを 2 つビルドする
# ライブラリをオンデマンドダウンロードするためビルドにはそれなりに時間がかかる (5分ぐらい)
# Docker build は最後のピリオドを忘れないように
cd ~/AzRefArc.SpringBoot
sudo docker build -t azrefarc.springboot:1 .
# トップページの文字を入れ替えた v2 アプリを作っておく
cp -b index_v2.html src/main/resources/templates/index.html
sudo docker build -t azrefarc.springboot:2 .
cd ~
# レポジトリにプッシュ
NAME_PREFIX=daisukenishino
ACR_NAME="${NAME_PREFIX}aksacr"
sudo docker tag azrefarc.springboot:1 ${ACR_NAME}.azurecr.io/azrefarc.springboot:1
sudo docker tag azrefarc.springboot:2 ${ACR_NAME}.azurecr.io/azrefarc.springboot:2# sudo docker login ${ACR_NAME}.azurecr.io だと username/password ログイン
# Azure AD 認証でログインするために、sudo az login したのちに az acr login コマンドを利用
# トークン書き込みのために sudo で実行
sudo az login
sudo az acr login --name ${ACR_NAME}.azurecr.iosudo docker push ${ACR_NAME}.azurecr.io/azrefarc.springboot:1
sudo docker push ${ACR_NAME}.azurecr.io/azrefarc.springboot:2image: daisukenishinoaksacr.azurecr.io/azrefarc.springboot:X
SET NAME_PREFIX=daisukenishino SET RG_AKS=%NAME_PREFIX%-aks-rg SET AKS_CLUSTER_NAME=%NAME_PREFIX%-aks az aks browse -n %AKS_CLUSTER_NAME% -g %RG_AKS%
kubectl apply -f web_v1.yaml
kubectl delete services web --namespace azrefarc-springboot
ココの作業は、コチラで言及したWindows開発環境で実施。
git clone https://github.com/ryo-ohnishi/node_express.git cd node_express docker-compose up -d
>docker-compose down
※ 動かなかったら何回か起動・停止を繰り返してみる。
>docker images REPOSITORY TAG IMAGE ID CREATED SIZE n-app latest 8aecd52a6fd3 45 minutes ago 674MB
>docker tag n-app daisukenishinoaksacr.azurecr.io/n-app:v1
※ ACR_NAMEは、以下で確認する。
$ echo $ACR_NAME
az login
az acr login --name daisukenishinoaksacr.azurecr.io
docker push daisukenishinoaksacr.azurecr.io/n-app:v1
CrashLoopBackOff, SyncLoadBalancerFailed
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: webapp
spec:
replicas: 3
selector:
matchLabels:
app: webapp
strategy:
rollingUpdate:
maxSurge: 1
maxUnavailable: 1
minReadySeconds: 5
template:
metadata:
labels:
app: webapp
spec:
containers:
- name: webapp
image: ***daisukenishinoaksacr.azurecr.io/XXXX:v1***
ports:
- containerPort: ***3000***
resources:
requests:
cpu: 250m
limits:
cpu: 500m
---
apiVersion: v1
kind: Service
metadata:
name: webapp
annotations:
service.beta.kubernetes.io/azure-load-balancer-internal: "true"
service.beta.kubernetes.io/azure-load-balancer-internal-subnet: "InternalEndpointSubnet"
spec:
selector:
app: webapp
ports:
- protocol: TCP
port: 80
targetPort: ***3000***
type: LoadBalancer
loadBalancerIP: 10.11.0.10
apiVersion: apps/v1
kind: Deployment
metadata:
name: azure-vote-back
spec:
replicas: 3
selector:
matchLabels:
app: azure-vote-back
template:
metadata:
labels:
app: azure-vote-back
spec:
nodeSelector:
"beta.kubernetes.io/os": linux
containers:
- name: azure-vote-back
image: redis
ports:
- containerPort: 6379
name: redis
---
apiVersion: v1
kind: Service
metadata:
name: azure-vote-back
spec:
ports:
- port: 6379
selector:
app: azure-vote-back
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: webapp
spec:
replicas: 3
selector:
matchLabels:
app: webapp
strategy:
rollingUpdate:
maxSurge: 1
maxUnavailable: 1
minReadySeconds: 5
template:
metadata:
labels:
app: webapp
spec:
containers:
- name: webapp
image: daisukenishinoaksacr.azurecr.io/azure-vote-front:v1
ports:
- containerPort: 80
resources:
requests:
cpu: 250m
limits:
cpu: 500m
env:
- name: REDIS
value: "azure-vote-back"
---
apiVersion: v1
kind: Service
metadata:
name: webapp
annotations:
service.beta.kubernetes.io/azure-load-balancer-internal: "true"
service.beta.kubernetes.io/azure-load-balancer-internal-subnet: "InternalEndpointSubnet"
spec:
selector:
app: webapp
ports:
- protocol: TCP
port: 80
targetPort: 80
type: LoadBalancer
loadBalancerIP: 10.11.0.10
Tags: :クラウド, :コンテナ, :Azure, :AKS, :セキュリティ, :通信技術, :セキュリティ, :認証基盤