1、參考文章
https://blog.51cto.com/3241766/2405624
(這個文章寫的條理挺好的,但是其中有好幾個地方會存在一些問題,在此文章最后面已經寫明,可以參考一下)
https://www.cnblogs.com/Erik_Xu/p/8783789.html
2、軟件版本相關概覽

Centos 7.6安裝參考:
https://www.cnblogs.com/zhuzi91/p/12356856.html
安裝步驟包含如下部分
1、docker 安裝(兩個節點都要執行)
2、k8s 安裝准備工作(兩個節點都要執行)
3、Master 節點安裝
4、Node 節點安裝
5、DashBoard 安裝(這個部分瀏覽器訪問的時候一直不出來,暫時還不知道是什么原因)
6、集群測試
1、Docker 安裝(兩個節點都要執行)
1>、docker 安裝 1)、移除舊版本的 docker yum remove docker docker-common docker-selinux docker-engine yum remove docker-ce rm -rf /var/lib/docker 2)、查看有沒有安裝 rpm -qa|grep device-mapper-persistent-data rpm -qa|grep lvm2 3)、安裝 yum install -y yum-utils device-mapper-persistent-data lvm2 4)、配置鏡像地址 yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo 5)、然后修改鏡像地址,更改為國內的,這樣可以下載快一點 vim /etc/yum.repos.d/docker-ce.repo 修改地址為清華的 %s@https://download.docker.com@https://mirrors.tuna.tsinghua.edu.cn/docker-ce 6)、更新緩存 yum makecache fast 2>、docker ce安裝 1)、安裝最新版的 docker-ce yum install -y docker-ce docker-ce-cli containerd.io ##安裝指定版本docer-ce 可使用以下命令查看 yum list docker-ce.x86_64 --showduplicates |sort -r ##安裝完成之后可以使用命令查看 docker version 3>、配置 docker 鏡像加速 vim /etc/docker/daemon.json { "registry-mirrors" : ["https://v16stybc.mirror.aliyuncs.com"] } ##通知 systemd 重載此配置文件 systemctl daemon-reload ##設置開機啟動 systemctl enable docker ##啟動 docker systemctl start docker
2、k8s 准備工作相關(兩個節點都要執行)
k8s 相關配置 1)、設置系統主機名以及 Host 文件的相互解析 hostnamectl set-hostname k8s-master01 2)、修改 hosts 文件 vim /etc/hosts 192.168.56.2 k8s-master01 192.168.56.3 node01 3)、驗證 uuid 和 mac 地址(enp0s3 根據自己的進入相應的目錄,ip addr 看一下網卡的名字即可) cat /sys/class/net/enp0s3/address cat /sys/class/dmi/id/product_uuid 4)、安裝依賴包 yum install -y conntrack ntpdate ntp ipvsadm ipset jq iptables curl sysstat libseccomp wgetvimnet-tools git 5)、設置防火牆為 Iptables 並設置空規則 systemctl stop firewalld && systemctl disable firewalld yum -y install iptables-services && systemctl start iptables && systemctl enable iptables&& iptables -F && service iptables save 6)、關閉 SELINUX(臨時禁用&&永久禁用) swapoff -a && sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab setenforce 0 && sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config 7)、調整內核參數,對於 K8S vim kubernetes.conf net.bridge.bridge-nf-call-iptables=1 net.bridge.bridge-nf-call-ip6tables=1 net.ipv4.ip_forward=1 net.ipv4.tcp_tw_recycle=0 # 禁止使用 swap 空間,只有當系統 OOM 時才允許使用它 vm.swappiness=0 # 不檢查物理內存是否夠用 vm.overcommit_memory=1 # 開啟 OOM fs.inotify.max_user_instances=8192 vm.panic_on_oom=0 fs.inotify.max_user_watches=1048576 fs.file-max=52706963 fs.nr_open=52706963 net.ipv6.conf.all.disable_ipv6=1 net.netfilter.nf_conntrack_max=2310720 cp kubernetes.conf /etc/sysctl.d/kubernetes.conf sysctl -p /etc/sysctl.d/kubernetes.conf 8)、 修改Cgroup Driver 1>、修改daemon.json [root@k8s-master01 ~]# vim /etc/docker/daemon.json { "registry-mirrors": ["https://v16stybc.mirror.aliyuncs.com"], "exec-opts": ["native.cgroupdriver=systemd"]//新增這行 } 2>、 重新加載docker [root@k8s-master01 ~]# systemctl daemon-reload && systemctl restart docker 修改cgroupdriver是為了消除告警: [WARNING IsDockerSystemdCheck]: detected "cgroupfs" as the Docker cgroup driver. The recommended driver is "systemd". Please follow the guide at https://kubernetes.io/docs/setup/cri/ 9)、新增 k8s 源 [root@k8s-master01 ~]#vim /etc/yum.repos.d/kubernetes.repo [kubernetes] name=Kubernetes baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64 enabled=1 gpgcheck=1 repo_gpgcheck=1 gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg [] 中括號中的是repository id,唯一,用來標識不同倉庫 name 倉庫名稱,自定義 baseurl 倉庫地址 enable 是否啟用該倉庫,默認為1表示啟用 gpgcheck 是否驗證從該倉庫獲得程序包的合法性,1為驗證 repo_gpgcheck 是否驗證元數據的合法性 元數據就是程序包列表,1為驗證 gpgkey=URL 數字簽名的公鑰文件所在位置,如果gpgcheck值為1,此處就需要指定gpgkey文件的位置,如果gpgcheck值為0就不需要此項了 更新緩存 [root@k8s-master01 ~]# yum clean all [root@k8s-master01 ~]# yum -y makecache 10)、調整系統時區,設置系統時區為中國/上海 timedatectl set-timezone Asia/Shanghai 將當前的 UTC 時間寫入硬件時鍾 timedatectl set-local-rtc 0 重啟依賴於系統時間的服務 systemctl restart rsyslog systemctl restart crond 11)、關閉系統不需要的服務 systemctl stop postfix && systemctl disable postfix 12)、設置 rsyslogd 和 systemd journald mkdir /var/log/journal 持久化保存日志的目錄 mkdir /etc/systemd/journald.conf.d vim /etc/systemd/journald.conf.d/99-prophet.conf Journal] #持久化保存到磁盤 Storage=persistent # 壓縮歷史日志 Compress=yes SyncIntervalSec=5 mRateLimitInterval=30s RateLimitBurst=1000 # 最大占用空間 10G SystemMaxUse=10G # 單日志文件最大 200M SystemMaxFileSize=200M # 日志保存時間 2 周 MaxRetentionSec=2week # 不將日志轉發到 syslogForwardToSyslog=no systemctl restart systemd-journald 13)、升級系統內核為 4.44CentOS 7.x 系統自帶的 3.10.x 內核存在一些 Bugs,導致運行的 Docker、Kubernetes 不穩定 rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm 安裝完成后檢查 /boot/grub2/grub.cfg 中對應內核 menuentry 中是否包含 initrd16 配置,如果沒有,再安裝一次! yum --enablerepo=elrepo-kernel install -y kernel-lt 設置開機從新內核啟動 grub2-set-default 'CentOS Linux (4.4.189-1.el7.elrepo.x86_64) 7 (Core)'
3、master 節點安裝
1. 版本查看 [root@k8s-master01 ~]# yum list kubelet --showduplicates | sort -r 2. 安裝kubelet、kubeadm和kubectl(不指定版本,默認用的就是最新版本) yum install -y kubelet kubeadm kubectl 2.1.安裝包說明 kubelet 運行在集群所有節點上,用於啟動Pod和容器等對象的工具 kubeadm 用於初始化集群,啟動集群的命令工具 kubectl 用於和集群通信的命令行,通過kubectl可以部署和管理應用,查看各種資源,創建、刪除和更新各種組件 2.2.啟動kubelet並設置開機啟動 [root@k8s-master01 ~]# systemctl enable kubelet && systemctl start kubelet 2.3.kubelet命令補全 [root@k8s-master01 ~]## echo "source <(kubectl completion bash)" >> ~/.bash_profile [root@k8s-master01 ~]# source ~/.bash_profile 3. 下載鏡像 3.1 Kubernetes幾乎所有的安裝組件和Docker鏡像都放在goolge自己的網站上,直接訪問可能會有網絡問題,這里的解決辦法是從阿里雲鏡像倉庫下載鏡像,拉取到本地以后改回默認的鏡像tag。 [root@k8s-master01 ~]## vim image.sh #!/bin/bash url=gcr.azk8s.cn/google-containers version=v1.17.3 images=(`kubeadm config images list --kubernetes-version=$version|awk -F '/' '{print $2}'`) for imagename in ${images[@]} ; do docker pull $url/$imagename docker tag $url/$imagename k8s.gcr.io/$imagename docker rmi -f $url/$imagename done url為阿里雲鏡像倉庫地址,version為安裝的kubernetes版本。 3.2 下載鏡像 1)、首先要給 image.sh 賦於執行權限 chmod u+x ./image.sh 2)、運行腳本image.sh,下載指定版本的鏡像 ./image.sh 4.初始化 master 4.1 初始化 [root@k8s-master01 ~]# kubeadm init --apiserver-advertise-address 192.168.56.2 --pod-network-cidr=10.244.0.0/16 apiserver-advertise-address指定master的interface,pod-network-cidr指定Pod網絡的范圍,這里使用flannel網絡方案 記錄kubeadm join的輸出,后面需要這個命令將各個節點加入集群中。輸出大概如下的內容: To start using your cluster, you need to run the following as a regular user: mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config You should now deploy a pod network to the cluster. Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at: https://kubernetes.io/docs/concepts/cluster-administration/addons/ Then you can join any number of worker nodes by running the following on each as root: kubeadm join 192.168.56.2:6443 --token f09fag.fohc5f0v9eb4ail5 \ --discovery-token-ca-cert-hash sha256:5c08d18980a8e0c251664fda92427814a02c31b152ac553b6539b5123067ce86 4.2 加載環境變量 [root@k8s-master01 ~]# echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile [root@k8s-master01 ~]# source ~/.bash_profile 本文所有操作都在root用戶下執行,若為非root用戶,則執行如下操作: mkdir -p $HOME/.kube cp -i /etc/kubernetes/admin.conf $HOME/.kube/config chown $(id -u):$(id -g) $HOME/.kube/config 5. 安裝pod網絡(如果此命令執行不成功,可能是文件拉取的問題,直接把這個文件下載到本地即可) [root@k8s-master01 ~]# kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/ kube-flannel.yml 下載本地后執行:(直接打開網址,復制到本地文件中) [root@k8s-master01 ~]#kubectl apply -f kube-flannel.yml 6. master節點配置 taint:污點的意思。如果一個節點被打上了污點,那么pod是不允許運行在這個節點上面的 6.1 刪除master節點默認污點 默認情況下集群不會在master上調度pod,如果偏想在master上調度Pod,可以執行如下操作: 查看污點: [root@k8s-master01 ~]# kubectl describe node master|grep -i taints Taints: node-role.kubernetes.io/master:NoSchedule 刪除默認污點: [root@k8s-master01 ~]# kubectl taint nodes master node-role.kubernetes.io/master- node/master untainted 6.2 污點機制 語法 kubectl taint node [node] key=value[effect] 其中[effect] 可取值: [ NoSchedule | PreferNoSchedule | NoExecute ] NoSchedule: 一定不能被調度 PreferNoSchedule: 盡量不要調度 NoExecute: 不僅不會調度, 還會驅逐Node上已有的Pod 打污點 [root@k8s-master01 ~]# kubectl taint node master key1=value1:NoSchedule node/master tainted [root@k8s-master01 ~]# kubectl describe node master|grep -i taints Taints: key1=value1:NoSchedule key為key1,value為value1(value可以為空),effect為NoSchedule表示一定不能被調度 刪除污點: [root@k8s-master01 ~]# kubectl taint nodes master key1- node/master untainted [root@k8s-master01 ~]# kubectl describe node master|grep -i taints Taints: <none> 刪除指定key所有的effect,‘-’表示移除所有以key1為鍵的污點
4、Node節點安裝
1)、查看令牌 [root@k8s-master01 ~]# kubeadm token list TOKEN TTL EXPIRES USAGES DESCRIPTION EXTRA GROUPS dnpkej.113e5cokaq30qcra 18h 2020-02-25T12:12:21+08:00 authentication,signing The default bootstrap token generated by 'kubeadm init'. system:bootstrappers:kubeadm:default-node-token 2)、 生成新的令牌(如果過期的話) [root@k8s-master01 ~]# kubeadm token create dnpkej.113e5cokaq30qcra 3)、 生成新的加密串 [root@k8s-master01 ~]# openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | \ openssl dgst -sha256 -hex | sed 's/^.* //' 63de5412694706097a440cb9375d5e06207dfdf225579aa04b489b6470ea46c3 4)、 node節點加入集群 在node節點上分別執行如下操作: [root@node01 tmp]# kubeadm join 192.168.56.2:6443 --token dnpkej.113e5cokaq30qcra --discovery-token-ca-cert-hash sha256:63de5412694706097a440cb9375d5e06207dfdf225579aa04b489b6470ea46c3
5、Dashboard安裝
1. 下載yaml [root@k8s-master01 ~]# wget https://github.com/yeyinzhu321/Centos7.6-install-k8s-v1.14.2-cluster/blob/master/kubernetes-dashboard.yaml 2. 配置yaml 2.1 修改鏡像地址 sed -i 's/k8s.gcr.io/registry.cn-hangzhou.aliyuncs.com\/kuberneters/g' kubernetes-dashboard.yaml 由於默認的鏡像倉庫網絡訪問不通,故改成阿里鏡像 2.2 外網訪問 sed -i '/targetPort:/a\ \ \ \ \ \ nodePort: 30001\n\ \ type: NodePort' kubernetes-dashboard.yaml 配置NodePort,外部通過https://NodeIp:NodePort 訪問Dashboard,此時端口為30001 2.3 新增管理員帳號(在文件最后添加如下的配置) vim kubernetes-dashboard.yaml --- # ------------------- dashboard-admin ------------------- # apiVersion: v1 kind: ServiceAccount metadata: name: dashboard-admin namespace: kube-system --- apiVersion: rbac.authorization.k8s.io/v1beta1 kind: ClusterRoleBinding metadata: name: dashboard-admin subjects: - kind: ServiceAccount name: dashboard-admin namespace: kube-system roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: cluster-admin 創建超級管理員的賬號用於登錄Dashboard 3. 部署訪問 3.1 部署Dashboard [root@k8s-master01 ~]# kubectl apply -f kubernetes-dashboard.yaml 3.2 狀態查看 [root@k8s-master01 ~]# kubectl get deployment kubernetes-dashboard -n kube-system [root@k8s-master01 ~]# kubectl get pods -n kube-system -o wide [root@k8s-master01 ~]# kubectl get services -n kube-system 3.3 令牌查看 kubectl describe secrets -n kube-system dashboard-admin 令牌為: eyJhbGciOiJSUzI1NiIsImtpZCI6InZDSWF3X1JBcjB6ZGFzbF9pZ0N4a0FKTEREMTFtZUJGVzlFVUJOdUNMMkEifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJkYXNoYm9hcmQtYWRtaW4tdG9rZW4tc21tdzkiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiZGFzaGJvYXJkLWFkbWluIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiYmE5MzExYzMtMDMyOC00ZTUzLTg0M2MtNjZhN2I4YzA4Njc3Iiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50Omt1YmUtc3lzdGVtOmRhc2hib2FyZC1hZG1pbiJ9.xi7exXIYJYr1r8epqdDqajmWK_5vIqcqvNhjEkmkkOstsH5eiFdlKvyIYNm416-98mD5CPYRWq4aSl1DmXYa1un6a37X0WV0bKaDDEj-oCCnFs5Sucol7sCs5IGMZ8xVRwQCYseLlPGJCuY0u3d-Fx3BtuiHlvuHKLIMEgNWHOIgcCX1bzArK7tBBQkzT6XJrwoij6NuV4cxbegTQ6WNbAAlx-m862lfzP9mcK_fM5fOvAaxePEnMMvqb8kQ4bgTmMKr2DqlS-2F4t6eiOPQx8vFZ-LURopOgAIC8akbbsfdnB1TJ9aaYdxqwG3BggR2mv1qEcp4dmdXKkn4tBeHnw 3.4 訪問 https://NodeIp:30001 Dashboard提供了可以實現集群管理、工作負載、服務發現和負載均衡、存儲、字典配置、日志視圖等功能。
6、集群測試
1. 部署應用 1.1 命令方式 [root@k8s-master01 ~]# kubectl run httpd-app --image=httpd --replicas=2 通過命令行方式部署apache服務 1.2 配置文件方式 vim nginx.yml apiVersion: apps/v1 kind: Deployment metadata: name: nginx-demo spec: selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx ports: - containerPort: 80 --- apiVersion: v1 kind: Service metadata: name: nginx-demo spec: type: NodePort ports: - name: nginx nodePort: 30000 port: 80 protocol: TCP targetPort: 80 selector: app: nginx [root@k8s-master01 ~]# kubectl apply -f nginx.yml deployment.extensions/nginx created 通過配置文件方式部署nginx服務 2. 狀態查看 2.1 查看節點狀態 [root@k8s-master01 ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION k8s-master01 Ready master 5h33m v1.17.3 node01 Ready <none> 5h32m v1.17.3 2.2 查看pod狀態 [root@k8s-master01 ~]# kubectl get pod --all-namespaces NAMESPACE NAME READY STATUS RESTARTS AGE default nginx-demo-85ff79dd56-svdbl 1/1 Running 0 4h12m kube-system coredns-6955765f44-498gl 1/1 Running 2 5h33m kube-system coredns-6955765f44-5895j 1/1 Running 2 5h33m kube-system etcd-k8s-master01 1/1 Running 1 5h34m kube-system kube-apiserver-k8s-master01 1/1 Running 1 5h34m kube-system kube-controller-manager-k8s-master01 1/1 Running 1 5h34m kube-system kube-flannel-ds-amd64-f8f44 1/1 Running 0 4h55m kube-system kube-flannel-ds-amd64-krhxq 1/1 Running 0 4h55m kube-system kube-proxy-9gfqq 1/1 Running 1 5h33m kube-system kube-proxy-kzlpw 1/1 Running 0 5h33m kube-system kube-scheduler-k8s-master01 1/1 Running 1 5h34m kube-system kubernetes-dashboard-778ff9499c-ph44s 1/1 Running 0 5h21m 2.3 查看副本數 [root@k8s-master01 ~]# kubectl get deployments NAME READY UP-TO-DATE AVAILABLE AGE nginx-demo 1/1 1 1 4h12m [root@k8s-master01 ~]# kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES nginx-demo-85ff79dd56-svdbl 1/1 Running 0 4h13m 10.244.1.8 node01 <none> <none> 可以看到nginx和httpd的3個副本pod均勻分布在3個節點上 2.4 查看deployment詳細信息 [root@k8s-master01 ~]# kubectl describe deployments 2.5 查看集群基本組件狀態 [root@k8s-master01 ~]# kubectl get cs NAME STATUS MESSAGE ERROR scheduler Healthy ok controller-manager Healthy ok etcd-0 Healthy {"health":"true"} 2.6 測試 [root@k8s-master01 ~]# curl 192.168.56.3:30000 <!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> <style> body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } </style> </head> <body> <h1>Welcome to nginx!</h1> <p>If you see this page, the nginx web server is successfully installed and working. Further configuration is required.</p> <p>For online documentation and support please refer to <a href="http://nginx.org/">nginx.org</a>.<br/> Commercial support is available at <a href="http://nginx.com/">nginx.com</a>.</p> <p><em>Thank you for using nginx.</em></p> </body> </html>
瀏覽器訪問如下:

7、 報錯總結
1)、image.sh 腳本做一下補充
1>、url 已經做了修改,按照文中的 url 我下載的時候下載不了,超時,所以我已經改為可以下載的 url 了
2>、version 一定要改為自己的版本
2)、安裝pod網絡時 apply 的時候,那個文件一直超時,如果這樣可以直接下載此文件即可
3)、如果 kubeadm init apply 的時候提示 xxx folder exist,執行如下的語句
kubeadm reset
4)、集群測試的時候 nginx.yaml 中如果apiVersion 寫的是 extension/v1beta1 的話,會報錯.改為如下的即可
apiVersion: apps/v1 kind: Deployment metadata: name: nginx-demo spec: selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx ports: - containerPort: 80 --- apiVersion: v1 kind: Service metadata: name: nginx-demo spec: type: NodePort ports: - name: nginx nodePort: 30000 port: 80 protocol: TCP targetPort: 80 selector: app: nginx
