pull/252/merge
stubblyhead 2017-12-18 15:00:37 +00:00 committed by GitHub
commit 902614ddd9
12 changed files with 633 additions and 1 deletions

View File

@ -44,4 +44,14 @@ gcloud config set compute/zone us-west1-c
> Use the `gcloud compute zones list` command to view additional regions and zones. > Use the `gcloud compute zones list` command to view additional regions and zones.
## Important note for Windows users
The commands for Windows in this tutorial are intended to be run using PowerShell and will
not work as intended using cmd. If you are at all unsure about what shell you're using
execute the following command:
```
(dir 2>&1 *`|echo CMD);&<# rem #>echo PowerShell
```
If it outputs `CMD` then execute `powershell.exe` before continuing.
Next: [Installing the Client Tools](02-client-tools.md) Next: [Installing the Client Tools](02-client-tools.md)

View File

@ -44,6 +44,21 @@ sudo mv cfssl_linux-amd64 /usr/local/bin/cfssl
sudo mv cfssljson_linux-amd64 /usr/local/bin/cfssljson sudo mv cfssljson_linux-amd64 /usr/local/bin/cfssljson
``` ```
### Windows
```
Invoke-WebRequest -Uri https://pkg.cfssl.org/R1.2/cfssl_windows-amd64.exe -OutFile cfssl.exe
```
```
Invoke-WebRequest -Uri https://pkg.cfssl.org/R1.2/cfssljson_windows-amd64.exe -OutFile cfssljson.exe
```
Add the current directory to the path (this will not persist between sessions):
```
$env:Path += ";$(Get-Location)"
```
### Verification ### Verification
Verify `cfssl` version 1.2.0 or higher is installed: Verify `cfssl` version 1.2.0 or higher is installed:
@ -94,6 +109,12 @@ chmod +x kubectl
sudo mv kubectl /usr/local/bin/ sudo mv kubectl /usr/local/bin/
``` ```
### Windows
```
Invoke-WebRequest -Uri https://storage.googleapis.com/kubernetes-release/release/v1.8.0/bin/windows/amd64/kubectl.exe -OutFile kubectl.exe
```
### Verification ### Verification
Verify `kubectl` version 1.9.0 or higher is installed: Verify `kubectl` version 1.9.0 or higher is installed:

View File

@ -24,18 +24,29 @@ A [subnet](https://cloud.google.com/compute/docs/vpc/#vpc_networks_and_subnets)
Create the `kubernetes` subnet in the `kubernetes-the-hard-way` VPC network: Create the `kubernetes` subnet in the `kubernetes-the-hard-way` VPC network:
##### Linux & OS X
``` ```
gcloud compute networks subnets create kubernetes \ gcloud compute networks subnets create kubernetes \
--network kubernetes-the-hard-way \ --network kubernetes-the-hard-way \
--range 10.240.0.0/24 --range 10.240.0.0/24
``` ```
#### Windows
```
gcloud compute networks subnets create kubernetes `
--network kubernetes-the-hard-way `
--range 10.240.0.0/24
```
> The `10.240.0.0/24` IP address range can host up to 254 compute instances. > The `10.240.0.0/24` IP address range can host up to 254 compute instances.
### Firewall Rules ### Firewall Rules
Create a firewall rule that allows internal communication across all protocols: Create a firewall rule that allows internal communication across all protocols:
#### Linux & OS X
``` ```
gcloud compute firewall-rules create kubernetes-the-hard-way-allow-internal \ gcloud compute firewall-rules create kubernetes-the-hard-way-allow-internal \
--allow tcp,udp,icmp \ --allow tcp,udp,icmp \
@ -43,8 +54,19 @@ gcloud compute firewall-rules create kubernetes-the-hard-way-allow-internal \
--source-ranges 10.240.0.0/24,10.200.0.0/16 --source-ranges 10.240.0.0/24,10.200.0.0/16
``` ```
#### Windows
```
gcloud compute firewall-rules create kubernetes-the-hard-way-allow-internal `
--allow tcp,udp,icmp `
--network kubernetes-the-hard-way `
--source-ranges 10.240.0.0/24,10.200.0.0/16
```
Create a firewall rule that allows external SSH, ICMP, and HTTPS: Create a firewall rule that allows external SSH, ICMP, and HTTPS:
#### Linux & OS X
``` ```
gcloud compute firewall-rules create kubernetes-the-hard-way-allow-external \ gcloud compute firewall-rules create kubernetes-the-hard-way-allow-external \
--allow tcp:22,tcp:6443,icmp \ --allow tcp:22,tcp:6443,icmp \
@ -52,6 +74,15 @@ gcloud compute firewall-rules create kubernetes-the-hard-way-allow-external \
--source-ranges 0.0.0.0/0 --source-ranges 0.0.0.0/0
``` ```
#### Windows
```
gcloud compute firewall-rules create kubernetes-the-hard-way-allow-external `
--allow tcp:22,tcp:6443,icmp `
--network kubernetes-the-hard-way `
--source-ranges 0.0.0.0/0
```
> An [external load balancer](https://cloud.google.com/compute/docs/load-balancing/network/) will be used to expose the Kubernetes API Servers to remote clients. > An [external load balancer](https://cloud.google.com/compute/docs/load-balancing/network/) will be used to expose the Kubernetes API Servers to remote clients.
List the firewall rules in the `kubernetes-the-hard-way` VPC network: List the firewall rules in the `kubernetes-the-hard-way` VPC network:
@ -72,11 +103,20 @@ kubernetes-the-hard-way-allow-internal kubernetes-the-hard-way INGRESS 1000
Allocate a static IP address that will be attached to the external load balancer fronting the Kubernetes API Servers: Allocate a static IP address that will be attached to the external load balancer fronting the Kubernetes API Servers:
#### Linux & OS X
``` ```
gcloud compute addresses create kubernetes-the-hard-way \ gcloud compute addresses create kubernetes-the-hard-way \
--region $(gcloud config get-value compute/region) --region $(gcloud config get-value compute/region)
``` ```
#### Windows
```
gcloud compute addresses create kubernetes-the-hard-way `
--region $(gcloud config get-value compute/region)
```
Verify the `kubernetes-the-hard-way` static IP address was created in your default compute region: Verify the `kubernetes-the-hard-way` static IP address was created in your default compute region:
``` ```
@ -98,6 +138,8 @@ The compute instances in this lab will be provisioned using [Ubuntu Server](http
Create three compute instances which will host the Kubernetes control plane: Create three compute instances which will host the Kubernetes control plane:
#### Linux & OS X
``` ```
for i in 0 1 2; do for i in 0 1 2; do
gcloud compute instances create controller-${i} \ gcloud compute instances create controller-${i} \
@ -114,6 +156,24 @@ for i in 0 1 2; do
done done
``` ```
#### Windows
```
@(0,1,2) | ForEach-Object {
gcloud compute instances create controller-$_ `
--async `
--boot-disk-size 200GB `
--can-ip-forward `
--image-family ubuntu-1604-lts `
--image-project ubuntu-os-cloud `
--machine-type n1-standard-1 `
--private-network-ip 10.240.0.1$_ `
--scopes compute-rw,storage-ro,service-management,service-control,logging-write,monitoring `
--subnet kubernetes `
--tags kubernetes-the-hard-way,controller
}
```
### Kubernetes Workers ### Kubernetes Workers
Each worker instance requires a pod subnet allocation from the Kubernetes cluster CIDR range. The pod subnet allocation will be used to configure container networking in a later exercise. The `pod-cidr` instance metadata will be used to expose pod subnet allocations to compute instances at runtime. Each worker instance requires a pod subnet allocation from the Kubernetes cluster CIDR range. The pod subnet allocation will be used to configure container networking in a later exercise. The `pod-cidr` instance metadata will be used to expose pod subnet allocations to compute instances at runtime.
@ -122,6 +182,8 @@ Each worker instance requires a pod subnet allocation from the Kubernetes cluste
Create three compute instances which will host the Kubernetes worker nodes: Create three compute instances which will host the Kubernetes worker nodes:
#### Linux & OS X
``` ```
for i in 0 1 2; do for i in 0 1 2; do
gcloud compute instances create worker-${i} \ gcloud compute instances create worker-${i} \
@ -139,6 +201,25 @@ for i in 0 1 2; do
done done
``` ```
#### Windows
```
@(0,1,2) | ForEach-Object {
gcloud compute instances create worker-$_ `
--async `
--boot-disk-size 200GB `
--can-ip-forward `
--image-family ubuntu-1604-lts `
--image-project ubuntu-os-cloud `
--machine-type n1-standard-1 `
--metadata pod-cidr=10.200.$_.0/24 `
--private-network-ip 10.240.0.2$_ `
--scopes compute-rw,storage-ro,service-management,service-control,logging-write,monitoring `
--subnet kubernetes `
--tags kubernetes-the-hard-way,worker
}
```
### Verification ### Verification
List the compute instances in your default compute zone: List the compute instances in your default compute zone:

View File

@ -8,6 +8,7 @@ In this section you will provision a Certificate Authority that can be used to g
Create the CA configuration file: Create the CA configuration file:
#### Linux & OS X
``` ```
cat > ca-config.json <<EOF cat > ca-config.json <<EOF
{ {
@ -26,8 +27,28 @@ cat > ca-config.json <<EOF
EOF EOF
``` ```
#### Windows
```
New-Item ca-config.json -Value @"
{
"signing": {
"default": {
"expiry": "8760h"
},
"profiles": {
"kubernetes": {
"usages": ["signing", "key encipherment", "server auth", "client auth"],
"expiry": "8760h"
}
}
}
}
"@
```
Create the CA certificate signing request: Create the CA certificate signing request:
#### Linux & OS X
``` ```
cat > ca-csr.json <<EOF cat > ca-csr.json <<EOF
{ {
@ -49,6 +70,28 @@ cat > ca-csr.json <<EOF
EOF EOF
``` ```
#### Windows
```
New-Item ca-csr.json -Value @"
{
"CN": "Kubernetes",
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "US",
"L": "Portland",
"O": "Kubernetes",
"OU": "CA",
"ST": "Oregon"
}
]
}
"@
```
Generate the CA certificate and private key: Generate the CA certificate and private key:
``` ```
@ -70,6 +113,7 @@ In this section you will generate client and server certificates for each Kubern
Create the `admin` client certificate signing request: Create the `admin` client certificate signing request:
#### Linux & OS X
``` ```
cat > admin-csr.json <<EOF cat > admin-csr.json <<EOF
{ {
@ -91,8 +135,31 @@ cat > admin-csr.json <<EOF
EOF EOF
``` ```
#### Windows
```
New-Item admin-csr.json -Value @"
{
"CN": "admin",
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "US",
"L": "Portland",
"O": "system:masters",
"OU": "Kubernetes The Hard Way",
"ST": "Oregon"
}
]
}
"@
```
Generate the `admin` client certificate and private key: Generate the `admin` client certificate and private key:
#### Linux & OS X
``` ```
cfssl gencert \ cfssl gencert \
-ca=ca.pem \ -ca=ca.pem \
@ -102,6 +169,16 @@ cfssl gencert \
admin-csr.json | cfssljson -bare admin admin-csr.json | cfssljson -bare admin
``` ```
#### Windows
```
cfssl gencert `
-ca ca.pem `
-ca-key ca-key.pem `
-config ca-config.json `
-profile kubernetes `
admin-csr.json | cfssljson -bare admin
```
Results: Results:
``` ```
@ -115,6 +192,7 @@ Kubernetes uses a [special-purpose authorization mode](https://kubernetes.io/doc
Generate a certificate and private key for each Kubernetes worker node: Generate a certificate and private key for each Kubernetes worker node:
#### Linux & OS X
``` ```
for instance in worker-0 worker-1 worker-2; do for instance in worker-0 worker-1 worker-2; do
cat > ${instance}-csr.json <<EOF cat > ${instance}-csr.json <<EOF
@ -152,6 +230,45 @@ cfssl gencert \
done done
``` ```
#### Windows
```
@('worker-0', 'worker-1', 'worker-2') | ForEach-Object {
New-Item $_-csr.json -Value @"
{
"CN": "system:node:$_",
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "US",
"L": "Portland",
"O": "system:nodes",
"OU": "Kubernetes The Hard Way",
"ST": "Oregon"
}
]
}
"@
$EXTERNAL_IP=$(gcloud compute instances describe $_ `
--format 'value(networkInterfaces[0].accessConfigs[0].natIP)')
$INTERNAL_IP=$(gcloud compute instances describe $_ `
--format 'value(networkInterfaces[0].networkIP)')
cfssl gencert `
-ca ca.pem `
-ca-key ca-key.pem `
-config ca-config.json `
-hostname $_,$EXTERNAL_IP,$INTERNAL_IP `
-profile kubernetes `
$_-csr.json | cfssljson -bare $_
}
```
Results: Results:
``` ```
@ -167,6 +284,7 @@ worker-2.pem
Create the `kube-proxy` client certificate signing request: Create the `kube-proxy` client certificate signing request:
#### Linux & OS X
``` ```
cat > kube-proxy-csr.json <<EOF cat > kube-proxy-csr.json <<EOF
{ {
@ -188,8 +306,31 @@ cat > kube-proxy-csr.json <<EOF
EOF EOF
``` ```
#### Windows
```
New-Item kube-proxy-csr.json -Value @"
{
"CN": "system:kube-proxy",
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "US",
"L": "Portland",
"O": "system:node-proxier",
"OU": "Kubernetes The Hard Way",
"ST": "Oregon"
}
]
}
"@
```
Generate the `kube-proxy` client certificate and private key: Generate the `kube-proxy` client certificate and private key:
#### Linux & OS X
``` ```
cfssl gencert \ cfssl gencert \
-ca=ca.pem \ -ca=ca.pem \
@ -199,6 +340,16 @@ cfssl gencert \
kube-proxy-csr.json | cfssljson -bare kube-proxy kube-proxy-csr.json | cfssljson -bare kube-proxy
``` ```
#### Windows
```
cfssl gencert `
-ca ca.pem `
-ca-key ca-key.pem `
-config ca-config.json `
-profile kubernetes `
kube-proxy-csr.json | cfssljson -bare kube-proxy
```
Results: Results:
``` ```
@ -212,14 +363,23 @@ The `kubernetes-the-hard-way` static IP address will be included in the list of
Retrieve the `kubernetes-the-hard-way` static IP address: Retrieve the `kubernetes-the-hard-way` static IP address:
#### Linux & OS X
``` ```
KUBERNETES_PUBLIC_ADDRESS=$(gcloud compute addresses describe kubernetes-the-hard-way \ KUBERNETES_PUBLIC_ADDRESS=$(gcloud compute addresses describe kubernetes-the-hard-way \
--region $(gcloud config get-value compute/region) \ --region $(gcloud config get-value compute/region) \
--format 'value(address)') --format 'value(address)')
``` ```
#### Windows
```
$KUBERNETES_PUBLIC_ADDRESS=$(gcloud compute addresses describe kubernetes-the-hard-way `
--region $(gcloud config get-value compute/region) `
--format 'value(address)')
```
Create the Kubernetes API Server certificate signing request: Create the Kubernetes API Server certificate signing request:
#### Linux & OS X
``` ```
cat > kubernetes-csr.json <<EOF cat > kubernetes-csr.json <<EOF
{ {
@ -241,8 +401,31 @@ cat > kubernetes-csr.json <<EOF
EOF EOF
``` ```
#### Windows
```
New-Item kubernetes-csr.json -Value @"
{
"CN": "kubernetes",
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "US",
"L": "Portland",
"O": "Kubernetes",
"OU": "Kubernetes The Hard Way",
"ST": "Oregon"
}
]
}
"@
```
Generate the Kubernetes API Server certificate and private key: Generate the Kubernetes API Server certificate and private key:
#### Linux & OS X
``` ```
cfssl gencert \ cfssl gencert \
-ca=ca.pem \ -ca=ca.pem \
@ -253,6 +436,17 @@ cfssl gencert \
kubernetes-csr.json | cfssljson -bare kubernetes kubernetes-csr.json | cfssljson -bare kubernetes
``` ```
#### Windows
```
cfssl gencert `
-ca ca.pem `
-ca-key ca-key.pem `
-config ca-config.json `
-hostname 10.32.0.1,10.240.0.10,10.240.0.11,10.240.0.12,$KUBERNETES_PUBLIC_ADDRESS,127.0.0.1,kubernetes.default `
-profile kubernetes `
kubernetes-csr.json | cfssljson -bare kubernetes
```
Results: Results:
``` ```
@ -264,20 +458,35 @@ kubernetes.pem
Copy the appropriate certificates and private keys to each worker instance: Copy the appropriate certificates and private keys to each worker instance:
#### Linux & OS X
``` ```
for instance in worker-0 worker-1 worker-2; do for instance in worker-0 worker-1 worker-2; do
gcloud compute scp ca.pem ${instance}-key.pem ${instance}.pem ${instance}:~/ gcloud compute scp ca.pem ${instance}-key.pem ${instance}.pem ${instance}:~/
done done
``` ```
#### Windows
```
@('worker-0','worker-1','worker-2') | ForEach-Object {
gcloud compute scp ca.pem "$_-key.pem" "$_.pem" ${_}:/home/$env:USERNAME/
}
```
Copy the appropriate certificates and private keys to each controller instance: Copy the appropriate certificates and private keys to each controller instance:
#### Linux & OS X
``` ```
for instance in controller-0 controller-1 controller-2; do for instance in controller-0 controller-1 controller-2; do
gcloud compute scp ca.pem ca-key.pem kubernetes-key.pem kubernetes.pem ${instance}:~/ gcloud compute scp ca.pem ca-key.pem kubernetes-key.pem kubernetes.pem ${instance}:~/
done done
``` ```
#### Windows
```
@('controller-0', 'controller-1', 'controller-2') | ForEach-Object {
gcloud compute scp ca.pem ca-key.pem kubernetes-key.pem kubernetes.pem ${_}:/home/$env:USERNAME/
}
```
> The `kube-proxy` and `kubelet` client certificates will be used to generate client authentication configuration files in the next lab. > The `kube-proxy` and `kubelet` client certificates will be used to generate client authentication configuration files in the next lab.
Next: [Generating Kubernetes Configuration Files for Authentication](05-kubernetes-configuration-files.md) Next: [Generating Kubernetes Configuration Files for Authentication](05-kubernetes-configuration-files.md)

View File

@ -14,18 +14,27 @@ Each kubeconfig requires a Kubernetes API Server to connect to. To support high
Retrieve the `kubernetes-the-hard-way` static IP address: Retrieve the `kubernetes-the-hard-way` static IP address:
#### Linux & OS X
``` ```
KUBERNETES_PUBLIC_ADDRESS=$(gcloud compute addresses describe kubernetes-the-hard-way \ KUBERNETES_PUBLIC_ADDRESS=$(gcloud compute addresses describe kubernetes-the-hard-way \
--region $(gcloud config get-value compute/region) \ --region $(gcloud config get-value compute/region) \
--format 'value(address)') --format 'value(address)')
``` ```
#### Windows
```
$KUBERNETES_PUBLIC_ADDRESS=$(gcloud compute addresses describe kubernetes-the-hard-way `
--region $(gcloud config get-value compute/region) `
--format 'value(address)')
```
### The kubelet Kubernetes Configuration File ### The kubelet Kubernetes Configuration File
When generating kubeconfig files for Kubelets the client certificate matching the Kubelet's node name must be used. This will ensure Kubelets are properly authorized by the Kubernetes [Node Authorizer](https://kubernetes.io/docs/admin/authorization/node/). When generating kubeconfig files for Kubelets the client certificate matching the Kubelet's node name must be used. This will ensure Kubelets are properly authorized by the Kubernetes [Node Authorizer](https://kubernetes.io/docs/admin/authorization/node/).
Generate a kubeconfig file for each worker node: Generate a kubeconfig file for each worker node:
#### Linux & OS X
``` ```
for instance in worker-0 worker-1 worker-2; do for instance in worker-0 worker-1 worker-2; do
kubectl config set-cluster kubernetes-the-hard-way \ kubectl config set-cluster kubernetes-the-hard-way \
@ -49,6 +58,30 @@ for instance in worker-0 worker-1 worker-2; do
done done
``` ```
#### Windows
```
@('worker-0','worker-1','worker-2') | ForEach-Object {
kubectl config set-cluster kubernetes-the-hard-way `
--certificate-authority=ca.pem `
--embed-certs=true `
--server=https://${KUBERNETES_PUBLIC_ADDRESS}:6443 `
--kubeconfig=$_.kubeconfig
kubectl config set-credentials system:node:$_ `
--client-certificate=$_.pem `
--client-key=$_-key.pem `
--embed-certs=true `
--kubeconfig=$_.kubeconfig
kubectl config set-context default `
--cluster=kubernetes-the-hard-way `
--user=system:node:$_ `
--kubeconfig=$_.kubeconfig
kubectl config use-context default --kubeconfig=$_.kubeconfig
}
```
Results: Results:
``` ```
@ -61,6 +94,7 @@ worker-2.kubeconfig
Generate a kubeconfig file for the `kube-proxy` service: Generate a kubeconfig file for the `kube-proxy` service:
#### Linux & OS X
``` ```
kubectl config set-cluster kubernetes-the-hard-way \ kubectl config set-cluster kubernetes-the-hard-way \
--certificate-authority=ca.pem \ --certificate-authority=ca.pem \
@ -88,14 +122,50 @@ kubectl config set-context default \
kubectl config use-context default --kubeconfig=kube-proxy.kubeconfig kubectl config use-context default --kubeconfig=kube-proxy.kubeconfig
``` ```
#### Windows
```
kubectl config set-cluster kubernetes-the-hard-way `
--certificate-authority=ca.pem `
--embed-certs=true `
--server=https://${KUBERNETES_PUBLIC_ADDRESS}:6443 `
--kubeconfig=kube-proxy.kubeconfig
```
```
kubectl config set-credentials kube-proxy `
--client-certificate=kube-proxy.pem `
--client-key=kube-proxy-key.pem `
--embed-certs=true `
--kubeconfig=kube-proxy.kubeconfig
```
```
kubectl config set-context default `
--cluster=kubernetes-the-hard-way `
--user=kube-proxy `
--kubeconfig=kube-proxy.kubeconfig
```
```
kubectl config use-context default --kubeconfig=kube-proxy.kubeconfig
```
## Distribute the Kubernetes Configuration Files ## Distribute the Kubernetes Configuration Files
Copy the appropriate `kubelet` and `kube-proxy` kubeconfig files to each worker instance: Copy the appropriate `kubelet` and `kube-proxy` kubeconfig files to each worker instance:
#### Linux & OS X
``` ```
for instance in worker-0 worker-1 worker-2; do for instance in worker-0 worker-1 worker-2; do
gcloud compute scp ${instance}.kubeconfig kube-proxy.kubeconfig ${instance}:~/ gcloud compute scp ${instance}.kubeconfig kube-proxy.kubeconfig ${instance}:~/
done done
``` ```
#### Windows
```
@('worker-0','worker-1','worker-2') | ForEach-Object {
gcloud compute scp "$_.kubeconfig" kube-proxy.kubeconfig ${_}:/home/$env:USERNAME/
}
```
Next: [Generating the Data Encryption Config and Key](06-data-encryption-keys.md) Next: [Generating the Data Encryption Config and Key](06-data-encryption-keys.md)

View File

@ -8,14 +8,21 @@ In this lab you will generate an encryption key and an [encryption config](https
Generate an encryption key: Generate an encryption key:
#### Linux & OS X
``` ```
ENCRYPTION_KEY=$(head -c 32 /dev/urandom | base64) ENCRYPTION_KEY=$(head -c 32 /dev/urandom | base64)
``` ```
#### Windows
```
$ENCRYPTION_KEY=[System.Convert]::ToBase64String($(0..31 | ForEach-Object { Get-Random -Minimum 0 -Maximum 255 } ))
```
## The Encryption Config File ## The Encryption Config File
Create the `encryption-config.yaml` encryption config file: Create the `encryption-config.yaml` encryption config file:
#### Linux & OS X
``` ```
cat > encryption-config.yaml <<EOF cat > encryption-config.yaml <<EOF
kind: EncryptionConfig kind: EncryptionConfig
@ -32,12 +39,37 @@ resources:
EOF EOF
``` ```
#### Windows
```
New-Item encryption-config.yaml -Value @"
kind: EncryptionConfig
apiVersion: v1
resources:
- resources:
- secrets
providers:
- aescbc:
keys:
- name: key1
secret: ${ENCRYPTION_KEY}
- identity: {}
"@
```
Copy the `encryption-config.yaml` encryption config file to each controller instance: Copy the `encryption-config.yaml` encryption config file to each controller instance:
#### Linux & OS X
``` ```
for instance in controller-0 controller-1 controller-2; do for instance in controller-0 controller-1 controller-2; do
gcloud compute scp encryption-config.yaml ${instance}:~/ gcloud compute scp encryption-config.yaml ${instance}:~/
done done
``` ```
#### Windows
```
@('controller-0','controller-1','controller-2') | ForEach-Object {
gcloud compute scp encryption-config.yaml ${_}:/home/$env:USERNAME/
}
```
Next: [Bootstrapping the etcd Cluster](07-bootstrapping-etcd.md) Next: [Bootstrapping the etcd Cluster](07-bootstrapping-etcd.md)

View File

@ -257,6 +257,7 @@ In this section you will provision an external load balancer to front the Kubern
Create the external load balancer network resources: Create the external load balancer network resources:
#### Linux & OS X
``` ```
gcloud compute target-pools create kubernetes-target-pool gcloud compute target-pools create kubernetes-target-pool
``` ```
@ -280,22 +281,68 @@ gcloud compute forwarding-rules create kubernetes-forwarding-rule \
--target-pool kubernetes-target-pool --target-pool kubernetes-target-pool
``` ```
#### Windows
```
gcloud compute target-pools create kubernetes-target-pool
```
```
gcloud compute target-pools add-instances kubernetes-target-pool `
--instances controller-0,controller-1,controller-2
```
```
$KUBERNETES_PUBLIC_ADDRESS=$(gcloud compute addresses describe kubernetes-the-hard-way `
--region $(gcloud config get-value compute/region) `
--format 'value(address)')
```
```
gcloud compute forwarding-rules create kubernetes-forwarding-rule `
--address ${KUBERNETES_PUBLIC_ADDRESS} `
--ports 6443 `
--region $(gcloud config get-value compute/region) `
--target-pool kubernetes-target-pool
```
### Verification ### Verification
Retrieve the `kubernetes-the-hard-way` static IP address: Retrieve the `kubernetes-the-hard-way` static IP address:
#### Linux & OS X
``` ```
KUBERNETES_PUBLIC_ADDRESS=$(gcloud compute addresses describe kubernetes-the-hard-way \ KUBERNETES_PUBLIC_ADDRESS=$(gcloud compute addresses describe kubernetes-the-hard-way \
--region $(gcloud config get-value compute/region) \ --region $(gcloud config get-value compute/region) \
--format 'value(address)') --format 'value(address)')
``` ```
#### Windows
```
$KUBERNETES_PUBLIC_ADDRESS=$(gcloud compute addresses describe kubernetes-the-hard-way `
--region $(gcloud config get-value compute/region) `
--format 'value(address)')
```
Make a HTTP request for the Kubernetes version info: Make a HTTP request for the Kubernetes version info:
#### Linux & OS X
``` ```
curl --cacert ca.pem https://${KUBERNETES_PUBLIC_ADDRESS}:6443/version curl --cacert ca.pem https://${KUBERNETES_PUBLIC_ADDRESS}:6443/version
``` ```
#### Windows
```
Import-Certificate -CertStoreLocation Cert:\CurrentUser\Root -FilePath ca.pem
```
This command will generate a warning making sure you want to install this certificate. Verify the information, and click Yes to install.
```
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
```
```
(Invoke-WebRequest https://${KUBERNETES_PUBLIC_ADDRESS}:6443/version).Content
```
> output > output
``` ```

View File

@ -10,14 +10,23 @@ Each kubeconfig requires a Kubernetes API Server to connect to. To support high
Retrieve the `kubernetes-the-hard-way` static IP address: Retrieve the `kubernetes-the-hard-way` static IP address:
#### Linux & OS X
``` ```
KUBERNETES_PUBLIC_ADDRESS=$(gcloud compute addresses describe kubernetes-the-hard-way \ KUBERNETES_PUBLIC_ADDRESS=$(gcloud compute addresses describe kubernetes-the-hard-way \
--region $(gcloud config get-value compute/region) \ --region $(gcloud config get-value compute/region) \
--format 'value(address)') --format 'value(address)')
``` ```
#### Windows
```
$KUBERNETES_PUBLIC_ADDRESS=$(gcloud compute addresses describe kubernetes-the-hard-way `
--region $(gcloud config get-value compute/region) `
--format 'value(address)')
```
Generate a kubeconfig file suitable for authenticating as the `admin` user: Generate a kubeconfig file suitable for authenticating as the `admin` user:
#### Linux & OS X
``` ```
kubectl config set-cluster kubernetes-the-hard-way \ kubectl config set-cluster kubernetes-the-hard-way \
--certificate-authority=ca.pem \ --certificate-authority=ca.pem \
@ -41,6 +50,30 @@ kubectl config set-context kubernetes-the-hard-way \
kubectl config use-context kubernetes-the-hard-way kubectl config use-context kubernetes-the-hard-way
``` ```
#### Windows
```
kubectl config set-cluster kubernetes-the-hard-way `
--certificate-authority=ca.pem `
--embed-certs=true `
--server=https://${KUBERNETES_PUBLIC_ADDRESS}:6443
```
```
kubectl config set-credentials admin `
--client-certificate=admin.pem `
--client-key=admin-key.pem
```
```
kubectl config set-context kubernetes-the-hard-way `
--cluster=kubernetes-the-hard-way `
--user=admin
```
```
kubectl config use-context kubernetes-the-hard-way
```
## Verification ## Verification
Check the health of the remote Kubernetes cluster: Check the health of the remote Kubernetes cluster:

View File

@ -12,13 +12,21 @@ In this section you will gather the information required to create routes in the
Print the internal IP address and Pod CIDR range for each worker instance: Print the internal IP address and Pod CIDR range for each worker instance:
#### Linux & OS X
``` ```
for instance in worker-0 worker-1 worker-2; do for instance in worker-0 worker-1 worker-2; do
gcloud compute instances describe ${instance} \ gcloud compute instances describe ${instance} \
--format 'value[separator=" "](networkInterfaces[0].networkIP,metadata.items[0].value)' --format '(networkInterfaces[0].networkIP,metadata.items[0].value)'
done done
``` ```
#### Windows
```
@('worker-0','worker-1','worker-2') | ForEach-Object {
gcloud compute instances describe $_ `
--format "value[separator=' '](networkInterfaces[0].networkIP,metadata.items[0].value)"
}
```
> output > output
``` ```
@ -31,6 +39,7 @@ done
Create network routes for each worker instance: Create network routes for each worker instance:
#### Linux & OS X
``` ```
for i in 0 1 2; do for i in 0 1 2; do
gcloud compute routes create kubernetes-route-10-200-${i}-0-24 \ gcloud compute routes create kubernetes-route-10-200-${i}-0-24 \
@ -40,6 +49,16 @@ for i in 0 1 2; do
done done
``` ```
#### Windows
```
@(0, 1, 2) | ForEach-Object {
gcloud compute routes create kubernetes-route-10-200-${_}-0-24 `
--network kubernetes-the-hard-way `
--next-hop-address 10.240.0.2${_} `
--destination-range 10.200.${_}.0/24
}
```
List the routes in the `kubernetes-the-hard-way` VPC network: List the routes in the `kubernetes-the-hard-way` VPC network:
``` ```

View File

@ -56,10 +56,16 @@ busybox-2125412808-mt2vb 1/1 Running 0 15s
Retrieve the full name of the `busybox` pod: Retrieve the full name of the `busybox` pod:
#### Linux & OS X
``` ```
POD_NAME=$(kubectl get pods -l run=busybox -o jsonpath="{.items[0].metadata.name}") POD_NAME=$(kubectl get pods -l run=busybox -o jsonpath="{.items[0].metadata.name}")
``` ```
#### Windows
```
$POD_NAME=$(kubectl get pods -l run=busybox -o jsonpath="{.items[0].metadata.name}")
```
Execute a DNS lookup for the `kubernetes` service inside the `busybox` pod: Execute a DNS lookup for the `kubernetes` service inside the `busybox` pod:
``` ```

View File

@ -8,18 +8,32 @@ In this section you will verify the ability to [encrypt secret data at rest](htt
Create a generic secret: Create a generic secret:
### Linux & OS X
``` ```
kubectl create secret generic kubernetes-the-hard-way \ kubectl create secret generic kubernetes-the-hard-way \
--from-literal="mykey=mydata" --from-literal="mykey=mydata"
``` ```
#### Windows
```
kubectl create secret generic kubernetes-the-hard-way `
--from-literal="mykey=mydata"
```
Print a hexdump of the `kubernetes-the-hard-way` secret stored in etcd: Print a hexdump of the `kubernetes-the-hard-way` secret stored in etcd:
#### Linux & OS X
``` ```
gcloud compute ssh controller-0 \ gcloud compute ssh controller-0 \
--command "ETCDCTL_API=3 etcdctl get /registry/secrets/default/kubernetes-the-hard-way | hexdump -C" --command "ETCDCTL_API=3 etcdctl get /registry/secrets/default/kubernetes-the-hard-way | hexdump -C"
``` ```
#### Windows
```
gcloud compute ssh controller-0 `
--command "ETCDCTL_API=3 etcdctl get /registry/secrets/default/kubernetes-the-hard-way" | Format-Hex
```
> output > output
``` ```
@ -72,10 +86,16 @@ In this section you will verify the ability to access applications remotely usin
Retrieve the full name of the `nginx` pod: Retrieve the full name of the `nginx` pod:
#### Linux & OS X
``` ```
POD_NAME=$(kubectl get pods -l run=nginx -o jsonpath="{.items[0].metadata.name}") POD_NAME=$(kubectl get pods -l run=nginx -o jsonpath="{.items[0].metadata.name}")
``` ```
#### Windows
```
$POD_NAME=$(kubectl get pods -l run=nginx -o jsonpath="{.items[0].metadata.name}")
```
Forward port `8080` on your local machine to port `80` of the `nginx` pod: Forward port `8080` on your local machine to port `80` of the `nginx` pod:
``` ```
@ -91,10 +111,16 @@ Forwarding from [::1]:8080 -> 80
In a new terminal make an HTTP request using the forwarding address: In a new terminal make an HTTP request using the forwarding address:
#### Linux & OS X
``` ```
curl --head http://127.0.0.1:8080 curl --head http://127.0.0.1:8080
``` ```
#### Windows
```
(Invoke-WebRequest -Method HEAD http://127.0.0.1:8080).RawContent
```
> output > output
``` ```
@ -164,32 +190,61 @@ kubectl expose deployment nginx --port 80 --type NodePort
Retrieve the node port assigned to the `nginx` service: Retrieve the node port assigned to the `nginx` service:
#### Linux & OS X
``` ```
NODE_PORT=$(kubectl get svc nginx \ NODE_PORT=$(kubectl get svc nginx \
--output=jsonpath='{range .spec.ports[0]}{.nodePort}') --output=jsonpath='{range .spec.ports[0]}{.nodePort}')
``` ```
#### Windows
```
$NODE_PORT=$(kubectl get svc nginx `
--output=jsonpath='{range .spec.ports[0]}{.nodePort}')
```
Create a firewall rule that allows remote access to the `nginx` node port: Create a firewall rule that allows remote access to the `nginx` node port:
#### Linux & OS X
``` ```
gcloud compute firewall-rules create kubernetes-the-hard-way-allow-nginx-service \ gcloud compute firewall-rules create kubernetes-the-hard-way-allow-nginx-service \
--allow=tcp:${NODE_PORT} \ --allow=tcp:${NODE_PORT} \
--network kubernetes-the-hard-way --network kubernetes-the-hard-way
``` ```
#### Windows
```
gcloud compute firewall-rules create kubernetes-the-hard-way-allow-nginx-service `
--allow=tcp:${NODE_PORT} `
--network kubernetes-the-hard-way
```
Retrieve the external IP address of a worker instance: Retrieve the external IP address of a worker instance:
#### Linux & OS X
``` ```
EXTERNAL_IP=$(gcloud compute instances describe worker-0 \ EXTERNAL_IP=$(gcloud compute instances describe worker-0 \
--format 'value(networkInterfaces[0].accessConfigs[0].natIP)') --format 'value(networkInterfaces[0].accessConfigs[0].natIP)')
``` ```
#### Windows
```
$EXTERNAL_IP=$(gcloud compute instances describe worker-0 `
--format 'value(networkInterfaces[0].accessConfigs[0].natIP)')
```
Make an HTTP request using the external IP address and the `nginx` node port: Make an HTTP request using the external IP address and the `nginx` node port:
#### Linux & OS X
``` ```
curl -I http://${EXTERNAL_IP}:${NODE_PORT} curl -I http://${EXTERNAL_IP}:${NODE_PORT}
``` ```
#### Windows
```
(Invoke-WebRequest -Method HEAD http://${EXTERNAL_IP}:${NODE_PORT}).RawContent
```
> output > output
``` ```

View File

@ -6,16 +6,25 @@ In this labs you will delete the compute resources created during this tutorial.
Delete the controller and worker compute instances: Delete the controller and worker compute instances:
#### Linux & OS X
``` ```
gcloud -q compute instances delete \ gcloud -q compute instances delete \
controller-0 controller-1 controller-2 \ controller-0 controller-1 controller-2 \
worker-0 worker-1 worker-2 worker-0 worker-1 worker-2
``` ```
#### Windows
```
gcloud -q compute instances delete `
controller-0 controller-1 controller-2 `
worker-0 worker-1 worker-2
```
## Networking ## Networking
Delete the external load balancer network resources: Delete the external load balancer network resources:
#### Linux & OS X
``` ```
gcloud -q compute forwarding-rules delete kubernetes-forwarding-rule \ gcloud -q compute forwarding-rules delete kubernetes-forwarding-rule \
--region $(gcloud config get-value compute/region) --region $(gcloud config get-value compute/region)
@ -25,6 +34,16 @@ gcloud -q compute forwarding-rules delete kubernetes-forwarding-rule \
gcloud -q compute target-pools delete kubernetes-target-pool gcloud -q compute target-pools delete kubernetes-target-pool
``` ```
#### Windows
```
gcloud -q compute forwarding-rules delete kubernetes-forwarding-rule `
--region $(gcloud config get-value compute/region)
```
```
gcloud -q compute target-pools delete kubernetes-target-pool
```
Delete the `kubernetes-the-hard-way` static IP address: Delete the `kubernetes-the-hard-way` static IP address:
``` ```
@ -33,6 +52,7 @@ gcloud -q compute addresses delete kubernetes-the-hard-way
Delete the `kubernetes-the-hard-way` firewall rules: Delete the `kubernetes-the-hard-way` firewall rules:
#### Linux & OS X
``` ```
gcloud -q compute firewall-rules delete \ gcloud -q compute firewall-rules delete \
kubernetes-the-hard-way-allow-nginx-service \ kubernetes-the-hard-way-allow-nginx-service \
@ -40,8 +60,17 @@ gcloud -q compute firewall-rules delete \
kubernetes-the-hard-way-allow-external kubernetes-the-hard-way-allow-external
``` ```
#### Windows
```
gcloud -q compute firewall-rules delete `
kubernetes-the-hard-way-allow-nginx-service `
kubernetes-the-hard-way-allow-internal `
kubernetes-the-hard-way-allow-external
```
Delete the Pod network routes: Delete the Pod network routes:
#### Linux & OS X
``` ```
gcloud -q compute routes delete \ gcloud -q compute routes delete \
kubernetes-route-10-200-0-0-24 \ kubernetes-route-10-200-0-0-24 \
@ -49,6 +78,14 @@ gcloud -q compute routes delete \
kubernetes-route-10-200-2-0-24 kubernetes-route-10-200-2-0-24
``` ```
#### Windows
```
gcloud -q compute routes delete `
kubernetes-route-10-200-0-0-24 `
kubernetes-route-10-200-1-0-24 `
kubernetes-route-10-200-2-0-24
```
Delete the `kubernetes` subnet: Delete the `kubernetes` subnet:
``` ```
@ -60,3 +97,15 @@ Delete the `kubernetes-the-hard-way` network VPC:
``` ```
gcloud -q compute networks delete kubernetes-the-hard-way gcloud -q compute networks delete kubernetes-the-hard-way
``` ```
## CA Certificate
#### Windows
Remove the CA certificate from the Root Certificates keystore:
```
Get-ChildItem -Path Cert:\CurrentUser\Root\ | Where-Object {
$_.Thumbprint -eq (Get-PfxCertificate .\ca.pem).Thumbprint } | Remove-Item
```
Confirm the certificate details in the confirmation dialog box, and click Yes to continue.