我在 Azure 虚拟机上安装了 MicroK8s 并添加了次要 IP 到网络接口,尝试从外部访问
背景和目标
如果想要验证在Kubernetes上运行的一些中间件,但又不至于需要单独准备AKS时,有时候可以在Azure VM上准备Ubuntu并运行MicroK8s。例如,为了验证Nginx的Pod和LoadBalancer,我用Azure CLI在NIC中添加了次要IP,从而能够从外部访问LoadBalancer。
创建一个用于验证的虚拟机。
# 環境変数をセットします
region=japaneast
prefix=mnrk8s
# リソースグループを作成します
az group create \
--name ${prefix}-rg \
--location $region
# 仮想マシンにログインするための SSH キーを作成します
ssh-keygen -m PEM -t rsa -b 4096 \
-f ${prefix}
# 仮想マシンを作成します
az vm create \
--resource-group ${prefix}-rg \
--name ${prefix}-vm \
--os-disk-name ${prefix}-vmOSDisk \
--image Canonical:0001-com-ubuntu-server-focal:20_04-lts:latest \
--admin-username azureuser \
--ssh-key-value ${prefix}.pub \
--size Standard_B2s \
--nsg-rule NONE \
--storage-sku Standard_LRS \
--public-ip-address-dns-name ${prefix}
# 自分の IP から SSH アクセスできるようにします
az network nsg rule create \
--resource-group ${prefix}-rg \
--name Allow-SSH \
--nsg-name ${prefix}-vmNSG \
--priority 100 \
--source-address-prefixes $(curl -s inet-ip.info) \
--destination-port-ranges 22 \
--access Allow \
--protocol Tcp
# SSH 接続します
ssh -i ${prefix} azureuser@${prefix}.japaneast.cloudapp.azure.com
安装和验证 MicroK8s
# MicroK8s をインストールします
sudo snap install microk8s --classic
# microk8s グループに azureuser を追加します
sudo usermod -a -G microk8s $USER
# microk8s グループにログインします
newgrp microk8s
# microk8s のステータスを確認します
microk8s status --wait-ready
# node のステータスが Ready なのを確認します
microk8s kubectl get nodes
# k8s 上のリソースを確認します
microk8s kubectl get all -A
# kubectl でコマンドを実行できるようエイリアスを設定します
echo "alias kubectl='microk8s kubectl'" >> ~/.bash_aliases
# エイリアスを有効にします
source ~/.bashrc
# k8s のバージョンを確認します
kubectl version --short
# Pod 内から名前解決できるようにします
microk8s enable dns
# nginx の Pod を立ててみます
kubectl run nginx --image=nginx
# Pod のステータスが Running になるまで待ちます(Ctrl+C で終了)
kubectl get pod -w
# Pod 内にある curl コマンドで名前解決できるか確認します
kubectl exec -it nginx -- curl inet-ip.info
# Pod を削除します
kubectl delete pod nginx
准备一个用于验证的Pod。
# microk8s の MetalLB を使用して LoadBalancer にプライベート IP を付与できるようにします
microk8s enable metallb:10.0.0.50-10.0.0.59
# LoadBalancer 込みの Nginx マニフェストを作成します
cat << EOF > nginx.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
selector:
matchLabels:
app: nginx
replicas: 1
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:alpine
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: nginx
spec:
ports:
- name: nginx
port: 80
selector:
app: nginx
type: LoadBalancer
EOF
# Nginx マニフェストをデプロイします
kubectl apply -f nginx.yaml
# Pod と LoadBalancer の状態を確認します
kubectl get pod,svc
# Nginx のコンテンツが取得できるか確認します
curl 10.0.0.50
# newgrp から抜けます
exit
# 仮想マシンから抜けます
exit
为虚拟机的网络接口添加次要IP。
# パブリック IP を作成します
az network public-ip create \
--resource-group ${prefix}-rg \
--name ${prefix}-vmPublicIP2 \
--sku Basic \
--dns-name ${prefix}-nginx
# NIC にセカンダリ IP を追加します
az network nic ip-config create \
--resource-group ${prefix}-rg \
--name ipconfig${prefix}-vm2 \
--nic-name ${prefix}-vmVMNic \
--private-ip-address 10.0.0.50 \
--vnet-name ${prefix}-vmVNET \
--subnet ${prefix}-vmSubnet \
--public-ip-address ${prefix}-vmPublicIP2
# 自分の IP から HTTP アクセスできるようにします
az network nsg rule create \
--resource-group ${prefix}-rg \
--name Allow-HTTP \
--nsg-name ${prefix}-vmNSG \
--priority 200 \
--source-address-prefixes $(curl -s inet-ip.info) \
--destination-port-ranges 80 \
--access Allow \
--protocol Tcp
# Nginx のコンテンツが取得できるか確認します
curl ${prefix}-nginx.japaneast.cloudapp.azure.com
删除验证环境
# リソースグループを削除します
az group delete \
--name ${prefix}-rg \
--yes
# SSH キーを削除します
rm -f ${prefix}*
请你以此为参考