部署一套單Master的K8s集群

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)境

kubernetes
角色 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

https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/#initializing-your-control-plane-node

在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)

https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/#pod-network

注意:只需要部署下面其中一個(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)簽篩選資源
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市剃斧,隨后出現(xiàn)的幾起案子轨香,更是在濱河造成了極大的恐慌,老刑警劉巖幼东,帶你破解...
    沈念sama閱讀 206,311評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件臂容,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡根蟹,警方通過查閱死者的電腦和手機(jī)脓杉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來简逮,“玉大人球散,你說我怎么就攤上這事∩⑹” “怎么了蕉堰?”我有些...
    開封第一講書人閱讀 152,671評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)悲龟。 經(jīng)常有香客問我屋讶,道長(zhǎng),這世上最難降的妖魔是什么躲舌? 我笑而不...
    開封第一講書人閱讀 55,252評(píng)論 1 279
  • 正文 為了忘掉前任丑婿,我火速辦了婚禮性雄,結(jié)果婚禮上没卸,老公的妹妹穿的比我還像新娘。我一直安慰自己秒旋,他們只是感情好约计,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評(píng)論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著迁筛,像睡著了一般煤蚌。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,031評(píng)論 1 285
  • 那天尉桩,我揣著相機(jī)與錄音筒占,去河邊找鬼。 笑死蜘犁,一個(gè)胖子當(dāng)著我的面吹牛翰苫,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播这橙,決...
    沈念sama閱讀 38,340評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼奏窑,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了屈扎?” 一聲冷哼從身側(cè)響起埃唯,我...
    開封第一講書人閱讀 36,973評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎鹰晨,沒想到半個(gè)月后墨叛,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,466評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡模蜡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評(píng)論 2 323
  • 正文 我和宋清朗相戀三年巍实,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片哩牍。...
    茶點(diǎn)故事閱讀 38,039評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡棚潦,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出膝昆,到底是詐尸還是另有隱情丸边,我是刑警寧澤,帶...
    沈念sama閱讀 33,701評(píng)論 4 323
  • 正文 年R本政府宣布荚孵,位于F島的核電站妹窖,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏收叶。R本人自食惡果不足惜骄呼,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望判没。 院中可真熱鬧蜓萄,春花似錦、人聲如沸澄峰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽俏竞。三九已至绸硕,卻和暖如春堂竟,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背玻佩。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工出嘹, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人咬崔。 一個(gè)月前我還...
    沈念sama閱讀 45,497評(píng)論 2 354
  • 正文 我出身青樓疚漆,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親刁赦。 傳聞我的和親對(duì)象是個(gè)殘疾皇子娶聘,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容