kubeadm是官方社區(qū)推出的一個(gè)用于快速部署kubernetes集群的工具絮姆。
安裝要求
在開始之前巡语,部署Kubernetes集群機(jī)器需要滿足以下幾個(gè)條件:
- 一臺(tái)或多臺(tái)機(jī)器,操作系統(tǒng) CentOS7.x-86_x64
- 硬件配置:2GB或更多RAM绍坝,2個(gè)CPU或更多CPU碰辅,硬盤30GB或更多
- 集群中所有機(jī)器之間網(wǎng)絡(luò)互通
- 可以訪問外網(wǎng),需要拉取鏡像
- 禁止swap分區(qū)
準(zhǔn)備環(huán)境
角色 | IP |
---|---|
k8s-master | 192.168.31.61 |
k8s-node1 | 192.168.31.62 |
k8s-node2 | 192.168.31.63 |
關(guān)閉防火墻:
$ systemctl stop firewalld
$ systemctl disable firewalld
關(guān)閉selinux:
$ sed -i 's/enforcing/disabled/' /etc/selinux/config # 永久
$ setenforce 0 # 臨時(shí)
關(guān)閉swap:
$ swapoff -a # 臨時(shí)
$ sed -i '/swap/s/^\(.*\)$/#\1/g' /etc/fstab # 永久
設(shè)置主機(jī)名:
$ hostnamectl set-hostname <hostname>
在master添加hosts:
$ cat >> /etc/hosts << EOF
192.168.31.61 k8s-master
192.168.31.62 k8s-node1
192.168.31.63 k8s-node2
EOF
將橋接的IPv4流量傳遞到iptables的鏈:
$ cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
$ sysctl --system # 生效
時(shí)間同步:
$ yum install ntpdate -y
$ ntpdate time.windows.com
安裝Docker/kubeadm/kubelet【所有節(jié)點(diǎn)】
Kubernetes默認(rèn)CRI(容器運(yùn)行時(shí))為Docker千所,因此先安裝Docker狂魔。
安裝Docker
$ wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
$ yum -y install docker-ce
$ systemctl enable docker && systemctl start docker
配置鏡像下載加速器:
$ cat > /etc/docker/daemon.json << EOF
{
"registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"]
}
EOF
$ systemctl restart docker
$ docker info
添加阿里云YUM軟件源
$ cat > /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
安裝kubeadm,kubelet和kubectl
由于版本更新頻繁淫痰,這里指定版本號(hào)部署:
$ yum install -y kubelet-1.20.0 kubeadm-1.20.0 kubectl-1.20.0
$ systemctl enable kubelet
部署Kubernetes Master
https://kubernetes.io/zh/docs/reference/setup-tools/kubeadm/kubeadm-init/#config-file
在192.168.31.61(Master)執(zhí)行最楷。
$ kubeadm init \
--apiserver-advertise-address=192.168.31.61 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.20.0 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16 \
--ignore-preflight-errors=all
- --apiserver-advertise-address 集群通告地址
- --image-repository 由于默認(rèn)拉取鏡像地址k8s.gcr.io國(guó)內(nèi)無法訪問,這里指定阿里云鏡像倉庫地址
- --kubernetes-version K8s版本,與上面安裝的一致
- --service-cidr 集群內(nèi)部虛擬網(wǎng)絡(luò)籽孙,Pod統(tǒng)一訪問入口
- --pod-network-cidr Pod網(wǎng)絡(luò)烈评,,與下面部署的CNI網(wǎng)絡(luò)組件yaml中保持一致
或者使用配置文件引導(dǎo):
$ vi kubeadm.conf
apiVersion: kubeadm.k8s.io/v1beta2
kind: ClusterConfiguration
kubernetesVersion: v1.20.0
imageRepository: registry.aliyuncs.com/google_containers
networking:
podSubnet: 10.244.0.0/16
serviceSubnet: 10.96.0.0/12
$ kubeadm init --config kubeadm.conf --ignore-preflight-errors=all
拷貝kubectl使用的連接k8s認(rèn)證文件到默認(rèn)路徑:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
localhost.localdomain NotReady control-plane,master 20s v1.20.0
加入Kubernetes Node
在192.168.31.62/63(Node)執(zhí)行犯建。
向集群添加新節(jié)點(diǎn)讲冠,執(zhí)行在kubeadm init輸出的kubeadm join命令:
$ kubeadm join 192.168.31.61:6443 --token 7gqt13.kncw9hg5085iwclx \
--discovery-token-ca-cert-hash sha256:66fbfcf18649a5841474c2dc4b9ff90c02fc05de0798ed690e1754437be35a01
默認(rèn)token有效期為24小時(shí),當(dāng)過期之后适瓦,該token就不可用了竿开。這時(shí)就需要重新創(chuàng)建token,可以直接使用命令快捷生成:
kubeadm token create --print-join-command
https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm-join/
部署容器網(wǎng)絡(luò)(CNI)
注意:只需要部署下面其中一個(gè)犹菇,推薦Calico德迹。
Calico是一個(gè)純?nèi)龑拥臄?shù)據(jù)中心網(wǎng)絡(luò)方案,Calico支持廣泛的平臺(tái)揭芍,包括Kubernetes胳搞、OpenStack等。
Calico 在每一個(gè)計(jì)算節(jié)點(diǎn)利用 Linux Kernel 實(shí)現(xiàn)了一個(gè)高效的虛擬路由器( vRouter) 來負(fù)責(zé)數(shù)據(jù)轉(zhuǎn)發(fā)称杨,而每個(gè) vRouter 通過 BGP 協(xié)議負(fù)責(zé)把自己上運(yùn)行的 workload 的路由信息向整個(gè) Calico 網(wǎng)絡(luò)內(nèi)傳播肌毅。
此外,Calico 項(xiàng)目還實(shí)現(xiàn)了 Kubernetes 網(wǎng)絡(luò)策略姑原,提供ACL功能悬而。
https://docs.projectcalico.org/getting-started/kubernetes/quickstart
$ wget https://docs.projectcalico.org/manifests/calico.yaml
下載完后還需要修改里面定義Pod網(wǎng)絡(luò)(CALICO_IPV4POOL_CIDR),與前面kubeadm init指定的一樣
修改完后應(yīng)用清單:
$ kubectl apply -f calico.yaml
$ kubectl get pods -n kube-system
測(cè)試kubernetes集群
- 驗(yàn)證Pod工作
- 驗(yàn)證Pod網(wǎng)絡(luò)通信
- 驗(yàn)證DNS解析
在Kubernetes集群中創(chuàng)建一個(gè)pod锭汛,驗(yàn)證是否正常運(yùn)行:
$ kubectl create deployment nginx --image=nginx
$ kubectl expose deployment nginx --port=80 --type=NodePort
$ kubectl get pod,svc
訪問地址:http://NodeIP:Port
部署 Dashboard
$ wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.3/aio/deploy/recommended.yaml
默認(rèn)Dashboard只能集群內(nèi)部訪問笨奠,修改Service為NodePort類型,暴露到外部:
$ vi recommended.yaml
...
kind: Service
apiVersion: v1
metadata:
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard
namespace: kubernetes-dashboard
spec:
ports:
- port: 443
targetPort: 8443
nodePort: 30001
selector:
k8s-app: kubernetes-dashboard
type: NodePort
...
$ kubectl apply -f recommended.yaml
$ kubectl get pods -n kubernetes-dashboard
NAME READY STATUS RESTARTS AGE
dashboard-metrics-scraper-6b4884c9d5-gl8nr 1/1 Running 0 13m
kubernetes-dashboard-7f99b75bf4-89cds 1/1 Running 0 13m
訪問地址:https://NodeIP:30001
創(chuàng)建service account并綁定默認(rèn)cluster-admin管理員集群角色:
# 創(chuàng)建用戶
$ kubectl create serviceaccount dashboard-admin -n kube-system
# 用戶授權(quán)
$ kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin
# 獲取用戶Token
$ kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}')
使用輸出的token登錄Dashboard唤殴。
切換容器引擎為Containerd
https://kubernetes.io/zh/docs/setup/production-environment/container-runtimes/#containerd
1般婆、配置先決條件
cat <<EOF | sudo tee /etc/modules-load.d/containerd.conf
overlay
br_netfilter
EOF
sudo modprobe overlay
sudo modprobe br_netfilter
# 設(shè)置必需的 sysctl 參數(shù),這些參數(shù)在重新啟動(dòng)后仍然存在朵逝。
cat <<EOF | sudo tee /etc/sysctl.d/99-kubernetes-cri.conf
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
EOF
# Apply sysctl params without reboot
sudo sysctl --system
2蔚袍、安裝containerd
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
yum update -y && sudo yum install -y containerd.io
mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml
systemctl restart containerd
3、修改配置文件
vi /etc/containerd/config.toml
[plugins."io.containerd.grpc.v1.cri"]
sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.2"
...
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
SystemdCgroup = true
...
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
endpoint = ["https://b9pmyelo.mirror.aliyuncs.com"]
systemctl restart containerd
4配名、配置kubelet使用containerd
vi /etc/sysconfig/kubelet
KUBELET_EXTRA_ARGS=--container-runtime=remote --container-runtime-endpoint=unix:///run/containerd/containerd.sock --cgroup-driver=systemd
systemctl restart kubelet
5啤咽、驗(yàn)證
kubectl get node -o wide
k8s-node1 xxx containerd://1.4.4
常見問題
怎么查看容器日志?
kubectl logs <容器名稱> -n kube-system
怎么查看容器事件渠脉?
kubectl describe pod <容器名稱> -n kube-system
calico無法拉取鏡像解決辦法宇整?
grep image calico.yaml
image: calico/cni:v3.15.1
image: calico/pod2daemon-flexvol:v3.15.1
image: calico/node:v3.15.1
docker pull xxx
docker save calico/cni:v3.15.1 > cni.tar
docker load < cni.tar
kubectl delete -f calico.yaml
kubectl apply -f calico.yaml
init失敗或者情況環(huán)境可以使用:
kubeadm reset
為什么部署網(wǎng)絡(luò)組件?
Q1:每個(gè)docker主機(jī)創(chuàng)建的容器ip可能沖突?
Q2:容器1訪問容器2芋膘,容器1怎么知道容器2在哪個(gè)docker主機(jī)鳞青?
Q3:容器1訪問容器2數(shù)據(jù)包怎么傳輸過去涩哟?
1、k8s現(xiàn)在可以使用docker嘛盼玄?
可以贴彼。
2、dockershim什么時(shí)候被移除埃儿?
預(yù)計(jì)1.23版本器仗。
3、docker還值的學(xué)習(xí)嘛童番?
值得精钮。
kubectl get pods --show-labels # 查看資源標(biāo)簽
kubectl get pod -l app=web # 根據(jù)標(biāo)簽篩選資源