01 搭建K8s集羣
GitHub
:https://github.com/kubernetes/kubeadm
課程中
:使用kubeadm搭建一個3臺機器組成的k8s集羣,1臺master節點,2臺worker節點如果大家機器配置不夠,也可以使用在線的,或者minikube的方式或者1個master和1個worker
配置要求
:
One or more machines running one of:
Ubuntu 16.04+
Debian 9+
CentOS 7【課程中使用】
Red Hat Enterprise Linux (RHEL) 7
Fedora 25+
HypriotOS v1.0.1+
Container Linux (tested with 1800.6.0)
2 GB or more of RAM per machine (any less will leave little room for your apps)
2 CPUs or more
Full network connectivity between all machines in the cluster (public or private network is fine)
Unique hostname, MAC address, and product_uuid for every node. See here for more details.
Certain ports are open on your machines. See here for more details.
Swap disabled. You MUST disable swap in order for the kubelet to work properly.
1.1 版本統一
Docker 18.09.0
---
kubeadm-1.14.0-0
kubelet-1.14.0-0
kubectl-1.14.0-0
---
k8s.gcr.io/kube-apiserver:v1.14.0
k8s.gcr.io/kube-controller-manager:v1.14.0
k8s.gcr.io/kube-scheduler:v1.14.0
k8s.gcr.io/kube-proxy:v1.14.0
k8s.gcr.io/pause:3.1
k8s.gcr.io/etcd:3.3.10
k8s.gcr.io/coredns:1.3.1
---
calico:v3.9
1.2 準備3臺centos
大家根據自己的情況來準備centos7的虛擬機。
要保證彼此之間能夠ping通,也就是處於同一個網絡中,虛擬機的配置要求上面也描述咯。
1.3 更新並安裝依賴
3臺機器都需要執行
yum -y update
yum install -y conntrack ipvsadm ipset jq sysstat curl iptables libseccomp
1.4 安裝Docker
根據之前學習的Docker方式[Docker第一節課的筆記中也有這塊的說明]
在每一臺機器上都安裝好Docker,版本爲18.09.0
01 安裝必要的依賴 sudo yum install -y yum-utils \ device-mapper-persistent-data \ lvm2 02 設置docker倉庫 sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 【設置要設置一下阿里雲鏡像加速器】 sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["這邊替換成自己的實際地址"] } EOF sudo systemctl daemon-reload 03 安裝docker yum install -y docker-ce-18.09.0 docker-ce-cli-18.09.0 containerd.io 04 啓動docker sudo systemctl start docker && sudo systemctl enable docker
1.5 修改hosts文件
(1)master
# 設置master的hostname,並且修改hosts文件
sudo hostnamectl set-hostname m
vi /etc/hosts
192.168.8.51 m
192.168.8.61 w1
192.168.8.62 w2
(2)兩個worker
# 設置worker01/02的hostname,並且修改hosts文件
sudo hostnamectl set-hostname w1
sudo hostnamectl set-hostname w2
vi /etc/hosts
192.168.8.51 m
192.168.8.61 w1
192.168.8.62 w2
(3)使用ping測試一下
1.6 系統基礎前提配置
# (1)關閉防火牆
systemctl stop firewalld && systemctl disable firewalld
# (2)關閉selinux
setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
# (3)關閉swap
swapoff -a
sed -i '/swap/s/^\(.*\)$/#\1/g' /etc/fstab
# (4)配置iptables的ACCEPT規則
iptables -F && iptables -X && iptables -F -t nat && iptables -X -t nat && iptables -P FORWARD ACCEPT
# (5)設置系統參數
cat <<EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system
1.7 Installing kubeadm, kubelet and kubectl
(1)配置yum源
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
(2)安裝kubeadm&kubelet&kubectl
yum install -y kubeadm-1.14.0-0 kubelet-1.14.0-0 kubectl-1.14.0-0
(3)docker和k8s設置同一個cgroup
# docker
vi /etc/docker/daemon.json
"exec-opts": ["native.cgroupdriver=systemd"],
systemctl restart docker
# kubelet,這邊如果發現輸出directory not exist,也說明是沒問題的,大家繼續往下進行即可
sed -i "s/cgroup-driver=systemd/cgroup-driver=cgroupfs/g" /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
systemctl enable kubelet && systemctl start kubelet
1.8 proxy/pause/scheduler等國內鏡像
(1)查看kubeadm使用的鏡像
kubeadm config images list
可以發現這裏都是國外的鏡像
k8s.gcr.io/kube-apiserver:v1.14.0
k8s.gcr.io/kube-controller-manager:v1.14.0
k8s.gcr.io/kube-scheduler:v1.14.0
k8s.gcr.io/kube-proxy:v1.14.0
k8s.gcr.io/pause:3.1
k8s.gcr.io/etcd:3.3.10
k8s.gcr.io/coredns:1.3.1
(2)解決國外鏡像不能訪問的問題
-
創建kubeadm.sh腳本,用於拉取鏡像/打tag/刪除原有鏡像
#!/bin/bash
set -e
KUBE_VERSION=v1.14.0
KUBE_PAUSE_VERSION=3.1
ETCD_VERSION=3.3.10
CORE_DNS_VERSION=1.3.1
GCR_URL=k8s.gcr.io
ALIYUN_URL=registry.cn-hangzhou.aliyuncs.com/google_containers
images=(kube-proxy:${KUBE_VERSION}
kube-scheduler:${KUBE_VERSION}
kube-controller-manager:${KUBE_VERSION}
kube-apiserver:${KUBE_VERSION}
pause:${KUBE_PAUSE_VERSION}
etcd:${ETCD_VERSION}
coredns:${CORE_DNS_VERSION})
for imageName in ${images[@]} ; do
docker pull $ALIYUN_URL/$imageName
docker tag $ALIYUN_URL/$imageName $GCR_URL/$imageName
docker rmi $ALIYUN_URL/$imageName
done
-
運行腳本和查看鏡像
# 運行腳本
sh ./kubeadm.sh
# 查看鏡像
docker images
-
如果這不不行的,跳出如下字樣.
Error response from daemon: Get https://registry.cn-hangzhou.aliyuncs.com/v2/: Get https://dockerauth.cn-hangzhou.aliyuncs.com/auth?account=zjhzzhouzhou&client_id=docker&offline_token=true&service=registry.aliyuncs.com%3Acn-hangzhou%3A26842: dial tcp: lookup dockerauth.cn-hangzhou.aliyuncs.com on 10.0.2.3:53: read udp 10.0.2.15:35540->10.0.2.3:53: i/o timeout
-
需要改dns,參考這個網址:https://blog.csdn.net/qq_34745957/article/details/88047545
-
將這些鏡像推送到自己的阿里雲倉庫【可選,根據自己實際的情況】
# 登錄自己的阿里雲倉庫
docker login --username=xxx registry.cn-hangzhou.aliyuncs.com
#!/bin/bash
set -e
KUBE_VERSION=v1.14.0
KUBE_PAUSE_VERSION=3.1
ETCD_VERSION=3.3.10
CORE_DNS_VERSION=1.3.1
GCR_URL=k8s.gcr.io
ALIYUN_URL=xxx
images=(kube-proxy:${KUBE_VERSION}
kube-scheduler:${KUBE_VERSION}
kube-controller-manager:${KUBE_VERSION}
kube-apiserver:${KUBE_VERSION}
pause:${KUBE_PAUSE_VERSION}
etcd:${ETCD_VERSION}
coredns:${CORE_DNS_VERSION})
for imageName in ${images[@]} ; do
docker tag $GCR_URL/$imageName $ALIYUN_URL/$imageName
docker push $ALIYUN_URL/$imageName
docker rmi $ALIYUN_URL/$imageName
done
運行腳本 sh ./kubeadm-push-aliyun.sh
1.9 kube init初始化master
(1)kube init流程
01-進行一系列檢查,以確定這臺機器可以部署kubernetes
02-生成kubernetes對外提供服務所需要的各種證書可對應目錄
/etc/kubernetes/pki/*
03-爲其他組件生成訪問kube-ApiServer所需的配置文件
ls /etc/kubernetes/
admin.conf controller-manager.conf kubelet.conf scheduler.conf
04-爲 Master組件生成Pod配置文件。
ls /etc/kubernetes/manifests/*.yaml
kube-apiserver.yaml
kube-controller-manager.yaml
kube-scheduler.yaml
05-生成etcd的Pod YAML文件。
ls /etc/kubernetes/manifests/*.yaml
kube-apiserver.yaml
kube-controller-manager.yaml
kube-scheduler.yaml
etcd.yaml
06-一旦這些 YAML 文件出現在被 kubelet 監視的/etc/kubernetes/manifests/目錄下,kubelet就會自動創建這些yaml文件定義的pod,即master組件的容器。master容器啓動後,kubeadm會通過檢查localhost:6443/healthz這個master組件的健康狀態檢查URL,等待master組件完全運行起來
07-爲集羣生成一個bootstrap token
08-將ca.crt等 Master節點的重要信息,通過ConfigMap的方式保存在etcd中,工後續部署node節點使用
09-最後一步是安裝默認插件,kubernetes默認kube-proxy和DNS兩個插件是必須安裝的
(2)初始化master節點
官網:https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm/
注意
:此操作是在主節點上進行
# 本地有鏡像
kubeadm init --kubernetes-version=1.14.0 --apiserver-advertise-address=192.168.8.51 --pod-network-cidr=10.244.0.0/16
【若要重新初始化集羣狀態:kubeadm reset,然後再進行上述操作(所有節點都要操作)】
記得保存好最後kubeadm join的信息
(3)根據日誌提示
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
此時kubectl cluster-info查看一下是否成功
(4)查看pod驗證一下
等待一會兒,同時可以發現像etc,controller,scheduler等組件都以pod的方式安裝成功了
注意
:coredns沒有啓動,需要安裝網絡插件
kubectl get pods -n kube-system
(5)健康檢查
curl -k https://localhost:6443/healthz
1.10 部署calico網絡插件
選擇網絡插件:https://kubernetes.io/docs/concepts/cluster-administration/addons/
calico網絡插件:https://docs.projectcalico.org/v3.9/getting-started/kubernetes/
calico,同樣在master節點上操作
# 在k8s中安裝calico
kubectl apply -f https://docs.projectcalico.org/v3.9/manifests/calico.yaml
# 確認一下calico是否安裝成功
kubectl get pods --all-namespaces -w
1.11 kube join
記得保存初始化master節點的最後打印信息【注意這邊大家要自己的,下面我的只是一個參考】
kubeadm join 192.168.0.51:6443 --token yu1ak0.2dcecvmpozsy8loh \
--discovery-token-ca-cert-hash sha256:5c4a69b3bb05b81b675db5559b0e4d7972f1d0a61195f217161522f464c307b0
(1)在woker01和worker02上執行上述命令
(2)在master節點上檢查集羣信息
kubectl get nodes
NAME STATUS ROLES AGE VERSION
master-kubeadm-k8s Ready master 19m v1.14.0
worker01-kubeadm-k8s Ready <none> 3m6s v1.14.0
worker02-kubeadm-k8s Ready <none> 2m41s v1.14.0
1.12 再次體驗Pod
(1)定義pod.yml文件,比如pod_nginx_rs.yaml
cat > pod_nginx_rs.yaml <<EOF
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: nginx
labels:
tier: frontend
spec:
replicas: 3
selector:
matchLabels:
tier: frontend
template:
metadata:
name: nginx
labels:
tier: frontend
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
EOF
(2)根據pod_nginx_rs.yml文件創建pod
kubectl apply -f pod_nginx_rs.yaml
(3)查看pod
kubectl get pods
kubectl get pods -o wide
kubectl describe pod nginx
(4)感受通過rs將pod擴容
kubectl scale rs nginx --replicas=5
kubectl get pods -o wide
(5)刪除pod
kubectl delete -f pod_nginx_rs.yaml