Nesta página, vai saber como implementar uma aplicação Windows Server sem estado num cluster do Google Kubernetes Engine (GKE). Também pode saber como implementar uma aplicação Windows com estado.
Antes de começar
Antes de começar, certifique-se de que realizou as seguintes tarefas:
- Ative a API Artifact Registry e a API Google Kubernetes Engine. Ativar APIs
- Se quiser usar a CLI gcloud para esta tarefa,
instale-a e, em seguida,
inicialize-a. Se instalou anteriormente a CLI gcloud, execute
gcloud components update
para obter a versão mais recente.
Implementar uma aplicação do Windows Server num cluster com nós públicos
Para implementar uma aplicação Windows Server num cluster do GKE com apenas nós públicos, tem de realizar as seguintes tarefas:
- Crie um cluster com nós públicos.
- Crie um ficheiro de manifesto de implementação.
- Crie e exponha a implementação.
- Verifique se o Pod está em execução.
Crie um cluster com nós públicos
Se já tiver um cluster do GKE que use pools de nós do Windows Server, continue para o passo seguinte. Caso contrário, crie um cluster com node pools do Windows Server.
Para aprovisionar nós com endereços IP externos (nós públicos), use a flag --no-enable-private-nodes
ao criar o cluster.
Crie um ficheiro de manifesto de implementação
Os nós do Windows Server estão
contaminados
com o seguinte par de chave-valor: node.kubernetes.io/os=windows:NoSchedule
.
Esta restrição garante que o programador do GKE não tenta executar contentores Linux em nós do Windows Server. Para agendar contentores do Windows Server em nós do Windows Server, o ficheiro de manifesto tem de incluir este seletor de nós:
nodeSelector:
kubernetes.io/os: windows
Um webhook de admissão em execução no cluster verifica novas cargas de trabalho quanto à presença deste seletor de nós do Windows e, quando encontrado, aplica a seguinte tolerância à carga de trabalho, o que lhe permite ser executada nos nós do Windows Server contaminados:
tolerations:
- effect: NoSchedule
key: node.kubernetes.io/os
operator: Equal
value: windows
Em alguns casos, pode ter de incluir esta tolerância explicitamente no ficheiro de manifesto. Por exemplo, se estiver a implementar um DaemonSet com uma imagem de contentor multi-arch para ser executada em todos os nós do Linux e do Windows Server no cluster, o ficheiro de manifesto não inclui o seletor de nós do Windows. Tem de incluir explicitamente a tolerância para a restrição do Windows.
Exemplo de ficheiro de manifesto
O ficheiro de implementação de exemplo seguinte (iis.yaml
) implementa a imagem do IIS da Microsoft num único pod:
apiVersion: apps/v1
kind: Deployment
metadata:
name: iis
labels:
app: iis
spec:
replicas: 1
selector:
matchLabels:
app: iis
template:
metadata:
labels:
app: iis
spec:
nodeSelector:
kubernetes.io/os: windows
containers:
- name: iis-server
image: mcr.microsoft.com/windows/servercore/iis
ports:
- containerPort: 80
Este ficheiro destina-se a um cluster onde todas as cargas de trabalho usam o mesmo tipo e versão de imagem do nó do Windows Server. Para ver detalhes sobre como trabalhar com imagens de nós mistos, consulte a secção Usar imagens de nós mistos.
Crie e exponha a implementação
Crie e exponha o ficheiro de implementação que criou no passo anterior como um serviço do Kubernetes com uma implementação de equilibrador de carga externo.
Para criar o recurso Deployment, execute o seguinte comando:
kubectl apply -f iis.yaml
Para expor a implementação como um balanceador de carga externo, execute o seguinte comando:
kubectl expose deployment iis \ --type=LoadBalancer \ --name=iis
Verifique se o Pod está em execução
Certifique-se de que o Pod está a funcionar validando-o.
Verifique o estado do Pod através do
kubectl
:kubectl get pods
Aguarde até que o resultado devolvido mostre que o agrupamento tem
Running
como estado:NAME READY STATUS RESTARTS AGE iis-5c997657fb-w95dl 1/1 Running 0 28s
Obtenha o estado do serviço e aguarde até que o campo
EXTERNAL-IP
seja preenchido:kubectl get service iis
Deverá ver o seguinte resultado:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE iis LoadBalancer 10.44.2.112 external-ip 80:32233/TCP 17s
Agora, pode usar o navegador para abrir http://EXTERNAL_IP
para ver a página Web do IIS.
Implementar uma aplicação do Windows Server num cluster com nós privados
Esta secção mostra como implementar uma aplicação de contentor do Windows Server num cluster do GKE ativado apenas com nós privados.
As imagens de contentores do Windows Server têm várias camadas, e as camadas base são fornecidas pela Microsoft. As camadas base são armazenadas como uma camada externa em vez de serem incorporadas na imagem, como acontece com as camadas de imagens do Linux Docker. Quando uma imagem de contentor do Windows Server é extraída pela primeira vez, as camadas base têm normalmente de ser transferidas dos servidores da Microsoft. Uma vez que os nós privados não têm conetividade à Internet, não é possível extrair diretamente as camadas do contentor base do Windows Server dos servidores da Microsoft.
Para usar clusters com nós privados ativados, pode configurar o daemon do Docker para permitir o envio de camadas não distribuíveis para registos privados. Para saber mais, consulte o artigo Permitir o envio de artefactos não distribuíveis na página do GitHub do Docker.
Para implementar a sua aplicação Windows Server num cluster ativado com nós privados:
- Crie um cluster com nós do Windows Server e ative os nós privados.
- Crie a imagem do Docker da aplicação Windows Server.
- Implemente a aplicação num cluster ativado com nós privados.
- Verifique se o Pod está em execução.
Crie um cluster com nós privados
Siga as instruções em Criar um cluster com nós do Windows Server. Para aprovisionar
nós apenas com endereços IP internos (nós privados), use a flag --enable-private-nodes
ao criar o cluster.
Crie a imagem do Docker da aplicação Windows Server
Para criar a imagem do Docker, inicie uma instância do Compute Engine com a versão do Windows Server na qual quer executar os contentores da sua aplicação, como o Windows Server 2019 ou o Windows Server versão 20H2. Além disso, certifique-se de que tem conetividade de Internet.
Na instância do Compute Engine, navegue para a configuração do daemon Docker:
cat C:\ProgramData\docker\config\daemon.json
Configure o ficheiro
daemon.json
do Docker para permitir o envio de camadas externas para o seu registo privado adicionando estas linhas:{ "allow-nondistributable-artifacts": ["REGISTRY_REGION-docker.pkg.dev"] }
Neste exemplo,
REGISTRY_REGION-docker.pkg.dev
refere-se ao Artifact Registry, onde a imagem vai ser alojada.Reinicie o daemon do Docker:
Restart-Service docker
Crie e etiquete a imagem do Docker para a sua aplicação:
cd C:\my-app
docker build -t REGISTRY_REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/my-app:v2 .
Este comando indica ao Docker para criar a imagem com o Dockerfile no diretório atual e etiquetá-la com um nome, como
us-central1-docker.pkg.dev/my-project/my-repository/my-app:v2
.Envie a imagem do Docker da aplicação para o repositório do Artifact Registry no seu projeto. A configuração
allow-nondistributable-artifacts
faz com que as camadas base do Windows sejam enviadas para o seu registo privado.docker push REGISTRY_REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/my-app:v2
Crie um ficheiro de manifesto de implementação
Segue-se um exemplo de um ficheiro de manifesto de implementação com o nome my-app.yaml
. A imagem neste exemplo é a que enviou no passo anterior (REGISTRY_REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/my-app:v2
).
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
labels:
app: my-app
spec:
replicas: 1
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
nodeSelector:
kubernetes.io/os: windows
containers:
- name: my-server
image: REGISTRY_REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/my-app:v2
Use o comando
get-credentials
para permitir que okubectl
funcione com o cluster que criou:gcloud container clusters get-credentials CLUSTER_NAME
Substitua
CLUSTER_NAME
pelo nome do cluster que criou.Implemente a aplicação especificada no ficheiro
my-app.yaml
no seu cluster:kubectl apply -f my-app.yaml
Verifique se o pod está em execução
Liste todos os pods para garantir que a aplicação está a ser executada corretamente:
kubectl get pods
Deve ver o pod com o estado Running
, como no seguinte resultado:
NAME READY STATUS RESTARTS AGE
my-app-c95fc5596-c9zcb 1/1 Running 0 5m
Usar imagens de nós misturadas
Os seus clusters podem conter conjuntos de nós com vários tipos de Windows Server e versões do Windows Server. Também podem combinar cargas de trabalho do Windows Server e do Linux. As secções seguintes fornecem detalhes sobre como configurar as suas cargas de trabalho para usar estes tipos de clusters.
Usar cargas de trabalho com diferentes tipos de imagens de nós do Windows Server
Pode adicionar pools de nós com diferentes tipos de imagens do Windows Server ao seu cluster. Num cluster com tipos de Windows Server mistos, tem de garantir que os contentores do Windows Server não são agendados num nó do Windows Server incompatível.
Se tiver um pool de nós do Windows Server LTSC e um pool de nós do Windows Server SAC, adicione a etiqueta de nó gke-os-distribution
a ambas as cargas de trabalho.
Inclua o nodeSelector seguinte no ficheiro de manifesto para as suas cargas de trabalho do Windows Server LTSC:
nodeSelector:
kubernetes.io/os: windows
cloud.google.com/gke-os-distribution: windows_ltsc
Inclua o nodeSelector seguinte no ficheiro de manifesto para as suas cargas de trabalho do Windows Server SAC.
nodeSelector:
kubernetes.io/os: windows
cloud.google.com/gke-os-distribution: windows_sac
A adição desta etiqueta garante que as suas imagens de contentores LTSC não são agendadas em nós SAC incompatíveis e vice-versa.
Usar cargas de trabalho com diferentes versões do SO Windows Server LTSC
Os nós do Windows Server suportam imagens do SO LTSC2022 e LTSC2019. Pode especificar a versão do SO Windows a usar (LTSC2022) com o seguinte par chave-valor em nodeSelector: cloud.google.com/gke-windows-os-version=2022
.
Esta etiqueta de nó garante que o programador do GKE escolhe os nós do Windows Server corretos para executar cargas de trabalho do LTSC2022 ou do LTSC2019. Os nós do Windows Server pertencem ao tipo de imagem windows_ltsc_containerd
. O valor da etiqueta do nó pode ser 2022
ou 2019
. Se a etiqueta do nó não for especificada, é possível usar nós LTSC2019 ou LTSC2022 para agendar contentores. Para agendar contentores do Windows Server apenas em nós do Windows Server LTSC2022, o ficheiro de manifesto tem de incluir este seletor de nós:
nodeSelector:
kubernetes.io/os: windows
cloud.google.com/gke-os-distribution: windows_ltsc
cloud.google.com/gke-windows-os-version: 2022
Usar cargas de trabalho com diferentes versões do Windows Server
Se precisar de executar pools de nós do Windows Server com várias versões LTSC ou SAC diferentes, recomendamos que crie as suas imagens de contentores como imagens multi-arquitetura que podem ser executadas em todas as versões do Windows Server em utilização no seu cluster.
A etiqueta do nó gke-os-distribution
não é suficiente para impedir que as suas cargas de trabalho sejam potencialmente agendadas em nós incompatíveis.
Usar cargas de trabalho do Linux e do Windows Server num cluster
Adicione o seguinte seletor de nós às suas cargas de trabalho do Linux para garantir que são sempre agendadas para nós do Linux:
nodeSelector:
kubernetes.io/os: linux
Isto oferece proteção adicional para evitar que as cargas de trabalho do Linux sejam agendadas em nós do Windows Server caso a marca NoSchedule
seja removida acidentalmente dos nós do Windows Server.