最近兩年kubernetes愈來愈火熱,生態圈愈來愈強大,朋友圈也常常有朋友發一些kubernetes的文章,週末閒着也是閒着,也寫點東西吧,從集羣的安裝、監控、日誌收集、CI/CD以及其它生產環境中一些場景,文章仍是以實戰內容爲主。node
etcd: 一款分佈式的一致性KV存儲存儲和服務發現系統,存儲了整個集羣的狀態linux
kube-apiserver: 提供kubernetes集羣的API調用git
kube-controller-manager:負責維護集羣的狀態,好比故障檢測、自動擴展、滾動更新等github
kube-scheduler:負責資源的調度docker
kubelet:負責維護容器的生命週期,同時也負責Volume(CSI)和網絡(CNI)的管理json
kube-proxy:負責爲Service提供cluster內部的服務發現和負載均衡centos
Container runtime:負責鏡像管理以及Pod和容器的真正運行(CRI)api
flannel: 一款網絡插件,集羣中的pod通信主要依賴於它安全
coredns: 負責爲整個集羣提供DNS服務bash
OS: CentOS 7.6.1810 HAProxy Vervion: 1.5.18 Docker Version: Docker-CE 18.09.1 Kubetnetes Version: v1.15.1 HAProxy: 192.168.199.200 Control-plane Node(master node): node-01: 192.168.199.201 node-02: 192.168.199.202 node-03: 192.168.199.203 Worker Node: node-04: 192.168.199.204 node-05: 192.168.199.205 node-06: 192.168.199.206
sudo systemctl stop firewalld sudo systemctl disable firewalld
setenforce 0 sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config
sudo swapoff -a
註釋swap掛載,以下圖:
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install -y docker-ce-18.09.1-3.el7
官方推薦修改 cgroup driver 爲 systemd,更穩定,詳見:https://kubernetes.io/docs/setup/cri
mkdir /etc/docker cat <<EOF > /etc/docker/daemon.json { "exec-opts": ["native.cgroupdriver=systemd"] } EOF systemctl restart docker systemctl enable docker
2. 配置 CNI插件(flannel) 所需的iptables轉發參數
cat <<EOF > /etc/sysctl.d/k8s.conf net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 EOF sysctl -p /etc/sysctl.d/k8s.conf
3. 安裝kubeadm、kubelet、kubectl
官方 yum 源國內訪問不了,這裏添加阿里雲 yum 源
cat <<EOF > /etc/yum.repos.d/kubernetes.repo [kubernetes] name=Kubernetes Repo baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/ gpgcheck=0 enabled=1 EOF
sudo yum install -y kubelet-1.15.1 kubeadm-1.15.1 kubectl-1.15.1 --disableexcludes=kubernetes systemctl enable kubelet
提示:上面步驟二 和 步驟三 全部k8s節點都須要執行
sudo yum install -y haproxy
vi /etc/haproxy/haproxy.cfg frontend k8s_apiserver *:6443 mode tcp default_backend k8s backend k8s mode tcp balance roundrobin server node-01 192.168.199.201:6443 check server node-02 192.168.199.202:6443 check server node-03 192.168.199.203:6443 check
systemctl reload haproxy
cat <<EOF > kubeadm-config.yaml apiVersion: kubeadm.k8s.io/v1beta2 kind: ClusterConfiguration kubernetesVersion: v1.15.1 controlPlaneEndpoint: "192.168.199.200:6443" imageRepository: "registry.aliyuncs.com/google_containers" networking: podSubnet: "10.244.0.0/16" apiServer: certSANs: - "k8s.mytest.com" EOF
# controlPlaneEndpoint haproxy 的負載均衡監聽地址 # imageRepository 默認使用gcr.io鏡像站,國內訪問不了,這裏指定從阿里雲的鏡像站拉鏡像
sudo kubeadm init --config=kubeadm-config.yaml --upload-certs
初始化成功,記錄下最後提示的 kubeadm join xxx 命令, 第一個是往集羣添加master node,第二個是往集羣添加 worker node
mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config
wget https://raw.githubusercontent.com/coreos/flannel/62e44c867a2846fefb68bd5f178daf4da3095ccb/Documentation/kube-flannel.yml
默認是從quay.io拉取flannel鏡像,可是常常由於網絡緣由拉不了,這裏從阿里雲找了一個替換了一下
sed -i s#'quay.io/coreos/flannel:v0.11.0-amd64'#'registry.cn-hangzhou.aliyuncs.com/mygcrio/flannel:v0.11.0-amd64'#g kube-flannel.yml kubectl apply -f kube-flannel.yml
kubeadm join 192.168.199.200:6443 --token ax13yr.yzsps775bllh0mlo \ --discovery-token-ca-cert-hash sha256:07b2b093be7ddabe7372b2c765b20343aa92f67db99286be1dc46b867a330f95 \ --control-plane --certificate-key b68cd457e26c827994c9804f8adf7a22720aba5a5e9f8e4e487a587b2c2fc127
docker run --rm -it --net host -v /etc/kubernetes:/etc/kubernetes \ registry.aliyuncs.com/google_containers/etcd:3.3.10 etcdctl \ --cert-file /etc/kubernetes/pki/etcd/peer.crt \ --key-file /etc/kubernetes/pki/etcd/peer.key \ --ca-file /etc/kubernetes/pki/etcd/ca.crt \ --endpoints https://192.168.199.201:2379 cluster-health
圖中能夠看出etcd 集羣健康狀態正常,到這裏master node基本已經安裝結束,下面開始添加worker node。
kubeadm join 192.168.199.200:6443 --token ax13yr.yzsps775bllh0mlo \ --discovery-token-ca-cert-hash sha256:07b2b093be7ddabe7372b2c765b20343aa92f67db99286be1dc46b867a330f95
各節點狀態正常,若是有節點狀態爲 NotReady,有多是該節點還未徹底初始化成功,能夠稍等片刻再查看是否正常。
若是想將 master node 同時當作 worker node使用,執行以下命令便可:
kubectl taint nodes --all node-role.kubernetes.io/master-
若是有系統組件pod狀態異常,使用 kubectl describe pod xxx 查看詳細信息。
dashboard 提供集羣的GUI
metrics server 提供資源監控(heapster 目前已經被官方棄用)
生產環境中使用 dashboard 推薦使用 HTTPS,證書獲取這裏就不寫了,能夠到阿里雲申請免費的DV證書或者 let's encrypt也能夠,我這裏使用 acme 申請了一個 let's encrypt 的證書,我這裏證書文件放在了 $HOME/certs 目錄下,裏面包含dashboard.crt、dashboard.key兩個證書文件;
導入證書
kubectl create secret generic kubernetes-dashboard-certs --from-file=$HOME/certs -n kube-system
下載和修改部署官方yaml文件的image,官方的鏡像站 k8s.gcr.io 訪問不了~訪問不了~訪問不了~~~
wget https://raw.githubusercontent.com/kubernetes/dashboard/v1.10.1/src/deploy/recommended/kubernetes-dashboard.yaml sed -i s#'k8s.gcr.io/kubernetes-dashboard-amd64'#'registry.aliyuncs.com/google_containers/kubernetes-dashboard-amd64'#g kubernetes-dashboard.yaml
部署
kubectl create -f kubernetes-dashboard.yaml
查看 pod 是否已經 running
kubectl get pods -n kube-system
建立完成後咱們還不能直接訪問dashboard,由於 dashboard 服務還沒暴露出來,生產中通常使用 ingress 對外服務,這裏咱們先用 nodeport 方式暴露出來,下篇文章會寫到 ingress 的使用;
kubectl expose svc kubernetes-dashboard --port=443 --target-port=8443 --type=NodePort --name=test-dashboard -n kube-system
查看 service test-dashboard 的 nodeport 端口號:
kubectl describe svc test-dashboard -n kube-system
使用任意節點 ip:端口號 訪問;使用ip可能會提示非安全訪問,由於訪問的域名和簽名申請的證書域名不一致致使,這裏先選擇繼續訪問便可,後續寫到 ingress 的時候也會解決
已經安裝成功,可是還需建立一個管理員用戶登陸:
vi admin-user.yaml apiVersion: v1 kind: ServiceAccount metadata: name: admin-user namespace: kube-system --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: admin-user roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: cluster-admin subjects: - kind: ServiceAccount name: admin-user namespace: kube-system
查看 token
kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep admin-user | awk '{print $1}')
登陸dashboard
2. 安裝 metrics-server
拉取 metrics-server 倉庫
git clone https://github.com/kubernetes-incubator/metrics-server.git
部署,官方image仍是下載不了,替換image
sed -i s#'k8s.gcr.io'#'registry.aliyuncs.com/google_containers'#g metrics-server/deploy/1.8+/metrics-server-deployment.yaml kubectl create -f metrics-server/deploy/1.8+/
肯定 pod 已經 running
kubectl get pods -n kube-system
編輯 deployment, 添加參數:
args: - --kubelet-insecure-tls - --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname
成功獲取cpu和內存指標,若是出現 "error: metrics not available yet", 那就稍等幾分鐘再試,metrics server 須要採集指標數據
參考:
官方文檔
kubernetes-handbook
下一篇主題:Traefik 安裝和使用
關注 公衆號 「運維實戰筆記」 獲取最新文章