參考連接html
https://blog.csdn.net/real_myth/article/details/78719244node
服務器IP角色分佈python
Test-01 172.16.119.214 kubernetes nodemysql
Test-02 172.16.119.223 kubernetes nodelinux
Test-03 172.16.119.224 kubernetes nodegit
Test-04 172.16.119.225 kubernetes mastergithub
Master節點必需組件sql
組件名稱docker |
做用數據庫 |
版本號 |
etcd |
非關係型數據庫 |
v1.9.1 |
kube-apiserver |
核心組件,全部組件均與其通訊,提供Http Restful接口 |
v1.9.1 |
kube-controller-manager |
集羣內部管理中心,負責各種資源管理,如RC,Pod,命名空間等 |
v1.9.1 |
kube-scheduler |
調度組件,負責node的調度 |
Node節點必需組件
組件名稱 |
做用 |
版本號 |
kubelet |
Node節點中核心組件,負責執行Master下發的任務 |
v1.9.1 |
kube-proxy |
代理,負責kubelet與apiserver網絡。至關於負載均衡,將請求轉到後端pod中 |
準備工做
先設置本機hosts,編譯/etc/hosts添加以下內容:
172.16.119.225 test-04
修改內核參數
cat <<EOF > /etc/sysctl.d/k8s.conf net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 net.ipv4.ip_forward=1 EOF sysctl --system
關閉swap k8s1.8版本之後,要求關閉swap,不然默認配置下kubelet將沒法啓動。
swapoff -a #防止開機自動掛載 swap 分區 sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
開啓ipvs
不是必須,只是建議,pod的負載均衡是用kube-proxy來實現的,實現方式有兩種,一種是默認的iptables,一種是ipvs,ipvs比iptable的性能更好而已。
ipvs是啥?爲啥要用ipvs?:https://blog.csdn.net/fanren224/article/details/86548398
後面master的高可用和集羣服務的負載均衡要用到ipvs,因此加載內核的如下模塊
須要開啓的模塊是
ip_vs
ip_vs_rr
ip_vs_wrr
ip_vs_sh
nf_conntrack_ipv4
檢查有沒有開啓
cut -f1 -d " " /proc/modules | grep -e ip_vs -e nf_conntrack_ipv4
沒有的話,使用如下命令加載
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
ipvs還須要ipset,檢查下有沒有。若是沒有,安裝
yum install ipset -y
關閉防火牆,禁用selinux
vi /etc/selinux/config disabled systemctl disable firewalld systemctl stop firewalld
軟件安裝
一、Mster節點:
yum install etcd kubernetes flannel
kubeadm:用於k8s節點管理(好比初始化主節點、集羣中加入子節佔爲、移除節點等)。
kubectl:用於管理k8s的各類資源(好比查看logs、rs、deploy、ds等)。
kubelet:k8s的服務。
配置/etc/etcd/etcd.conf
ETCD_DATA_DIR="/var/lib/etcd/master.etcd" ETCD_LISTEN_CLIENT_URLS="http://127.0.0.1:2379,http://172.16.119.225:2379 " ETCD_NAME="master" ETCD_ADVERTISE_CLIENT_URLS="http://127.0.0.1:2379,http://172.16.119.225:2379"
啓動etcd
systemctl restart etcd && systemctl enable etcd
檢查etcd的健康指標
etcdctl -C http://172.16.119.225:2379 cluster-health
配置etcd中關於flannel的key 也就是分配給docker的網段
etcdctl mk /atomic.io/network/config '{ "Network": "10.254.0.0/16" }'
配置 /etc/sysconfig/flanneld
FLANNEL_ETCD_ENDPOINTS="http://172.16.119.225:2379" FLANNEL_ETCD_PREFIX="/atomic.io/network"
啓動flannel
systemctl start flanneld && systemctl enable flanneld
配置/etc/kubernetes/apiserver
KUBE_API_ADDRESS="--insecure-bind-address=0.0.0.0" #此參數爲綁定不安全地址,綁定安全地址參數是 --bind-address=172.16.119.225KUBE_ETCD_SERVERS="--etcd-servers=http://172.16.119.225:2379" KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=10.254.0.0/16" KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ServiceAccount,ResourceQuota" KUBE_API_ARGS=""
重啓服務並設置開機自啓動
systemctl restart kube-apiserver && systemctl enable kube-apiserver systemctl restart kube-controller-manager && systemctl enable kube-controller-manager systemctl restart kube-scheduler && systemctl enable kube-scheduler
二、node節點:
一、安裝配置flannel
yum install flannel
配置flannel:/etc/sysconfig/flanneld
FLANNEL_ETCD_ENDPOINTS="http://172.16.119.225:2379" # 172.16.119.225爲master地址
FLANNEL_ETCD_PREFIX="/atomic.io/network"
啓動flannel
systemctl start flanneld && systemctl enable flanneld
二、安裝kubernetes
yum install kubernetes
不一樣於master節點,slave節點上須要運行kubernetes的以下組件:
kubelet
kubernets-proxy
配置/etc/kubernetes/config
KUBE_LOGTOSTDERR="--logtostderr=true" # journal message level, 0 is debug KUBE_LOG_LEVEL="--v=0" # Should this cluster be allowed to run privileged docker containers KUBE_ALLOW_PRIV="--allow-privileged=false" # How the controller-manager, scheduler, and proxy find the apiserver KUBE_MASTER="--master=http://172.16.119.225:8080" #172.16.119.225爲master地址
配置 /etc/kubernetes/kubelet
# The address for the info server to serve on (set to 0.0.0.0 or "" for all interfaces) KUBELET_ADDRESS="--address=172.16.119.225" # The port for the info server to serve on KUBELET_PORT="--port=10250" # You may leave this blank to use the actual hostname KUBELET_HOSTNAME="--hostname-override= 172.16.119.214" #node的名字,隨意取 # 172.16.119.214爲node地址 # location of the api-server KUBELET_API_SERVER="--api-servers=http://172.16.119.225:6442" #172.16.119.225爲master地址 # pod infrastructure container KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=registry.access.redhat.com/rhel7/pod-infrastructure:latest" # Add your own! KUBELET_ARGS=""
啓動kube服務
systemctl restart kubelet && systemctl enable kubelet
systemctl restart kube-proxy && systemctl enable kube-proxy
至此,k8s集羣的搭建過程就完成一半了
驗證集羣狀態
認證受權設置
參考連接:https://www.cnblogs.com/lemon-le/p/9970783.html
集羣搭建好後務必設置認證受權,不然等後面配置Kubernetes Api Server時會由於沒有安全配置致使服務器被滲透,參考https://www.jianshu.com/p/e443b3171253
步驟以下:
一、中止原有kubernetes相關服務,包括service,deployments,pods以及運行的全部kubernetes組件
master節點上:
systemctl stop kube-apiserver systemctl stop kube-controller-manager systemctl stop kube-schedulerrm -fr /var/lib/kubelet/*
rm -fr /var/lib/kube-proxy/*
node節點上:
systemctl stop kubelet systemctl stop kube-proxy
rm -fr /var/lib/kubelet/*
rm -fr /var/lib/kube-proxy/*
二、設置kube-apiserver的ca證書的相關文件和啓動參數
openssl genrsa -out ca.key 2048 openssl req -x509 -new -nodes -key ca.key -subj "/CN=test-04" -days 5000 -out ca.crt openssl genrsa -out server.key 2048
注意:生成ca.crt時 /CN 值爲master主機名
而後準備master_ssl.conf文件,該文件用於x509 v3版本證書,文件中主要設置master主機 hostname 、ip、 k8s 虛擬賦權名稱和該虛擬服務的ClusterIP地址
內容以下:
[req] req_extensions = v3_req distinguished_name = req_distinguished_name [req_distinguished_name] [ v3_req ] basicConstraints = CA:FALSE keyUsage = nonRepudiation,digitalSignature,keyEncipherment subjectAltName = @alt_names [alt_names] DNS.1 = kubernetes DNS.2 = kubernetes.default DNS.3 = kubernetes.default.svc DNS.4 = kubernetes.default.svc.cluster.local DNS.5 = test-04 #服務器的hostname IP.1 = 172.16.119.225 #master ip IP.2 = 10.254.0.1 #svc的cluster ip 若是cluster網段是 10.254.0.0/16 此處就寫10.254.0.1
而後基於master_ssl.conf文件建立server.csr和server.crt文件,在生成server.csr時,-subject參數中 /CN 值爲master主機名
openssl req -new -key server.key -subj "/CN=test-04" -config master_ssl.conf -out server.csr openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -days 5000 -extensions v3_req -extfile master_ssl.conf -out server.crt
所有執行完畢會生成6個文件:ca.crt ca.key ca.srl server.crt server.csr server.key 將這些文件複製到一個目錄下,如 /var/run/kubernetes/
/var/run/kubernetes/ 默認只有apiserver.crt 、 apiserver.key 、kubelet.crt和kubelet.key四個文件
而後在kube-apiserver文件 KUBE_API_ARGS中添加三個啓動參數 --client-ca-file --tls-cert-file 和 --tls-private-key-file,分別表明CA根證書文件、服務器端證書文件和服務端私鑰文件
同時能夠更改KUBE_API_ADDRESS KUBE_API_PORT KUBE_API_ARGS參數關掉非安全端口8080,設置安全端口爲6442,默認爲6443
KUBE_API_ADDRESS="--bind-address=172.16.119.225" KUBE_API_PORT="--secure-port=0" # Comma separated list of nodes in the etcd cluster KUBE_ETCD_SERVERS="--etcd-servers=http://172.16.119.225:2379" # Address range to use for services KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=10.254.0.0/16" # default admission control policies KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ServiceAccount,ResourceQuota" # Add your own! KUBE_API_ARGS="--client-ca-file=/var/run/kubernetes/ca.crt --tls-cert-file=/var/run/kubernetes/server.crt --tls-private-key-file=/var/run/kubernetes/server.key --secure-port=6442"
最後重啓kube-apiserver服務
systemctl restart kube-apiserver
三、設置kube-controller-manager的客戶端證書、私鑰和啓動參數
openssl genrsa -out cs_client.key 2048 openssl req -new -key cs_client.key -subj "/CN=test-04" -out cs_client.csr openssl x509 -req -in cs_client.csr -CA /var/run/kubernetes/ca.crt -CAkey /var/run/kubernetes/ca.key -CAcreateserial -out cs_client.crt -days 5000
此步會生成3個文件:cs_client.key cs_client.crt cs_client.csr 把生成的證書複製到/var/run/kubernetes/ 而後建立/etc/kubernetes/kubeconfig文件,(kube-controller-manager與kube-scheduler共用),配置客戶端證書等參數,內容以下:
apiVersion: v1
kind: Config
users:
- name: controllermanager
user:
client-certificate: /var/run/kubernetes/cs_client.crt
client-key: /var/run/kubernetes/cs_client.key
clusters:
- name: local
cluster:
certificate-authority: /var/run/kubernetes/ca.crt
contexts:
- context:
cluster: local
user: controllermanager
name: my-context
current-context: my-context
而後,設置kube-controller-manager服務啓動參數,注意 --master的地址爲https安全服務地址
更改/etc/kubernetes/controller-manager 啓動參數
KUBE_CONTROLLER_MANAGER_ARGS="--master=https://172.16.119.225:6442 --service_account_private_key_file=/var/run/kubernetes/server.key --root-ca-file=/var/run/kubernetes/ca.crt --kubeconfig=/etc/kubernetes/kubeconfig"
更改/etc/kubernetes/config 裏 KUBE_MASTER="--master=http://127.0.0.1:8080" 改爲上面設置的安全地址 KUBE_MASTER="--master=https://172.16.119.225:6442"
重啓kube-controller-manager服務
systemctl restart kube-controller-manager
四、設置kube-scheduler參數
kube-scheduler複用上一步kube-controller-manager建立的客戶端證書,只須要修改/etc/kubernetes/scheduler啓動參數便可
KUBE_SCHEDULER_ARGS="--master=https://172.16.119.225:6442 --kubeconfig=/etc/kubernetes/kubeconfig"
重啓kube-scheduler服務
systemctl restart kube-scheduler
五、設置每臺node上kubelet的客戶端證書、私鑰和啓動參數
首先複製kube-apiserver的ca.crt和ca.key文件到node上,而後生成kubelet_client.crt證書,生成證書時-CA參數和-CAkey參數使用的是apiserver的ca.crt和ca.key文件;生成kubelet_client.csr是 -subj參數中 /CN 爲本機node ip地址
openssl genrsa -out kubelet_client.key 2048 openssl req -new -key kubelet_client.key -subj "/CN=172.16.119.225" -out kubelet_client.csr openssl x509 -req -in kubelet_client.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out kubelet_client.crt -days 5000
此步會生成3個文件:kubelet_client.key kubelet_client.csr kubelet_client.crt 而後把生成的證書複製到/var/run/kubernetes/目錄下
接下來建立/etc/kubernetes/kube_client_config文件(kubelet和kube-proxy共用),配置客戶端證書等相關參數,內容以下:
apiVersion: v1
kind: Config
users:
- name: kubelet
user:
client-certificate: /var/run/kubernetes/kubelet_client.crt
client-key: /var/run/kubernetes/kubelet_client.key
clusters:
- name: local
cluster:
certificate-authority: /var/run/kubernetes/ca.crt
contexts:
- context:
cluster: local
user: kubelet
name: my-context
current-context: my-context
而後設置kubelet啓動參數
# location of the api-server KUBELET_API_SERVER="--api-servers=https://172.16.119.225:6442" # pod infrastructure container KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=registry.access.redhat.com/rhel7/pod-infrastructure:latest" # Add your own! KUBELET_ARGS="--kubeconfig=/etc/kubernetes/kube_client_config"
重啓kubelet服務
systemctl restart kubelet
六、設置kube-proxy啓動參數
kube-proxy複用上一步建立的客戶端證書,只需配置啓動參數便可
vim /etc/kubernetes/proxy
KUBE_PROXY_ARGS="--master=https://172.16.119.225:6442 --kubeconfig=/etc/kubernetes/kube_client_config"
重啓kube-proxy服務
systemctl restart kube-proxy
七、設置kubectl客戶端使用安全方式訪問apiserver
在使用kubectl對kubenetes集羣進行操做時,默認使用非安全端口8080對apiserver進行訪問,也能夠設置設置爲安全訪問apiserver的模式,此模式須要設置3個證書相關的參數 --certificat-authority --client-certificate 和 --client-key
分別表示用於CA受權證書、客戶端證書和客戶端祕鑰,其中
--certificat-authority 使用爲kube-apiserver生成的ca.crt文件
--client-certificate 使用爲kube-controller-manager生成的cs_client.crt文件
--client-key 使用爲kube-controller-manager生成的cs_client.key文件
同時指定apiserver的URL地址爲HTTPS安全地址,最後輸入須要執行的子命令,便可對apiserver進行安全訪問了:
kubectl --server=https://172.16.119.225:6442 --certificate-authority=/var/run/kubernetes/ca.crt --client-certificate=/var/run/kubernetes/cs_client.crt --client-key=/var/run/kubernetes/cs_client.key get nodes
但每次這樣忒麻煩了,因此寫個alias,不知道還有沒有其餘方法
編輯 ~/.bashrc
vim ~/.bashrc 增長下面一局而後source ~/.bashrc 便可
alias kubectl='kubectl --server=https://172.16.119.225:6442 --certificate-authority=/var/run/kubernetes/ca.crt --client-certificate=/var/run/kubernetes/cs_client.crt --client-key=/var/run/kubernetes/cs_client.key'
DNS服務搭建
https://blog.51cto.com/ylw6006/2067923
Kubernetes集羣機制經過DNS進行服務名和ip的映射,若是沒有配置dns,能夠經過kubectl get svc 命令查詢集羣ip,
但Cluster-ip是變化的,若是經過一個create命令一次批量創建一堆具備相互依賴關係的Pod或者RC,就須要配置DNS
DNS 有兩種配置方式,在 1.3 以前使用 etcd + kube2sky + skydns 的方式,在 1.3 以後可使用 kubedns + dnsmasq 的方式。
推薦使用kubedns + dnsmasq 的方式,本次也是使用此方式。
先建立目錄,skydns文件都放在/etc/kubernetes/skydns 下
mkdir /etc/kubernetes/skydns
一、配置etcd中關於skyDNS的key
etcdctl mk /skydns/config '{"dns-addr":"10.254.254.254:53","ttl":3600,"domain":"cluster.local."}'
二、skynds服務由一個RC和一個Service定義組成,分別由配置文件skydns-rc.yaml和 skydns-svc.yaml定義:
skydns-rc.yaml包含2個容器的定義,須要修改以下幾個參數:
--kube_master_url 爲master所在的物理主機IP和端口
--domain=cluster.local 設置kubernetes集羣中Service所屬的域名,本例爲cluster.local
apiVersion: v1 kind: ReplicationController metadata: name: kube-dns namespace: kube-system labels: k8s-app: kube-dns version: v12 kubernetes.io/cluster-service: "true" spec: replicas: 1 selector: k8s-app: kube-dns version: v12 template: metadata: labels: k8s-app: kube-dns version: v12 kubernetes.io/cluster-service: "true" spec: containers: - name: kube2sky image: docker.io/port/kubernetes-kube2sky resources: limits: cpu: 100m memory: 50Mi requests: cpu: 100m memory: 50Mi args: - --kube_master_url=https://172.16.119.225:6442 - -domain=cluster.local - -etcd-server=http://172.16.119.225:2379 - name: skydns image: docker.io/skynetservices/skydns resources: limits: cpu: 100m memory: 50Mi requests: cpu: 100m memory: 50Mi args: - -machines=http://172.16.119.225:2379 - -addr=0.0.0.0:53 - -ns-rotate=false - -domain=cluster.local. # 點 不能少 ports: - containerPort: 53 name: dns protocol: UDP - containerPort: 53 name: dns-tcp protocol: TCP dnsPolicy: Default
skydns-svc.yaml
apiVersion: v1 kind: Service metadata: name: kube-dns namespace: kube-system labels: k8s-app: kube-dns kubernetes.io/cluster-service: "true" kubernetes.io/name: "KubeDNS" spec: selector: k8s-app: kube-dns clusterIP: 10.254.254.254 ports: - name: dns port: 53 protocol: UDP - name: dns-tcp port: 53 protocol: TCP
注意,skydns須要指定一個固定的IP,以後每一個node節點啓動都將使用這個IP,且這個IP必定要是kube-apiserver啓動參數--service-cluster-ip-range範圍內的IP。
建立skydns以前須要修改每一個node上kubelet的啓動參數。
三、修改node啓動參數
編譯kubelet文件,添加倆個啓動參數
--cluster-dns 上面配置的10.254.254.254
--cluster-domain 上面配置的cluster.local
KUBELET_ARGS="--kubeconfig=/etc/kubernetes/kube_client_config --cluster-dns=10.254.254.254 --cluster-domain=cluster.local"
而後重啓kubelet服務
systemctl restart kubelet
四、建立skydns的RC和SVC
kubectl create -f skydns/skydns-rc.yaml
kubectl create -f skydns/skydns-svc.yaml
查看RC pod svc,確保容器啓動成功,若是沒有啓動成功,查看緣由是否是鏡像地址更改了,若是鏡像地址改了,能夠登陸http://docker.gaoxiaobang.com查看新的鏡像地址
若是pod沒法啓動,可參考文尾解決辦法
至此,在Kubernetes集羣內的虛擬DNS服務已搭建完畢。
五、測試效果
部署一個test-dns的Pod進行驗證
apiVersion: v1 kind: Pod metadata: name: test-dns namespace: default spec: containers: - name: test-dns image: busybox command: - sleep - "3600"
啓動test-dns
容器啓動成功後,經過下面命令進行測試
kubectl exec -it test-dns sh
也能夠新建一個pod,而後用 kubectl exec <container_id> nslookup 驗證
若是某個Service屬於不一樣的命名空間,則進行Service查找時,須要帶上namespace的名字,如:
kubectl exec test-dns -- nslookup default.kubernetes
安裝Dashboard
一、下載代碼
git clone https://github.com/Qihoo360/wayne/
其中 目錄下面就是咱們須要部署的 Wayne 的資源清單文件hack/kubernetes
二、咱們這裏將全部服務都部署到 kube-system
命名空間下面,因此將這裏的資源清單中的 namespace
都統一改爲 kube-system
grep -rl default wayne/hack/kubernetes/wayne/ | xargs sed -i 's/default/kube-system/'
三、因爲咱們這裏是使用上面集羣中部署的 MySQL 服務,因此這裏須要對 configmap.yaml 文件進行簡單的配置,而 360 文檔上面的 ConfigMap 是不完整的,須要使用源碼裏面的 app.conf
文件來進行建立,因此咱們這裏可使用 --from-file
關鍵字來建立 ConfigMap 對象,首先配置下 wayne/src/backend/conf/app.conf 文件,根據我的須要修改,也能夠不改,使用默認的配置,而後建立ConfigMap
kubectl create configmap infra-wayne --namespace kube-system --from-file=wayne/src/backend/conf/app.conf
四、而後部署另外倆個應用
kubectl create -f wayne/hack/kubernetes/wayne/deployment.yaml
kubectl create -f wayne/hack/kubernetes/wayne/service.yaml
五、建立完成後,能夠查看下 Pod 的狀態,若是沒有錯誤信息,就證實部署成功了
kubectl get pods -n kube-system
若是失敗可用
kubectl logs -n kube-system -f infra-wayne-312744915-xdb8b 查看錯誤信息
或者
kubectl describe -n kube-system pods infra-wayne-312744915-xdb8b
六、查看端口
kubectl get svc -n kube-system -l app=infra-wayne
而後使用本機IP:30771來訪問 Wayne
---------------------------------------------
異常解決
一、kubectl create -f mysql.yaml 後pod沒法啓動,用kubectl get pod 發現該pod處於ContainerCreating狀態
使用kubectl describe pod mysql-wayne-3939478235-x83pm 查看具體信息時發現報錯以下:
解決辦法:
各個node節點上都須要安裝
yum install *rhsm*
docker pull registry.access.redhat.com/rhel7/pod-infrastructure:latest
若是還報錯則進行以下步驟
wget http://mirror.centos.org/centos/7/os/x86_64/Packages/python-rhsm-certificates-1.19.10-1.el7_4.x86_64.rpm rpm2cpio python-rhsm-certificates-1.19.10-1.el7_4.x86_64.rpm | cpio -iv --to-stdout ./etc/rhsm/ca/redhat-uep.pem | tee /etc/rhsm/ca/redhat-uep.pem docker pull registry.access.redhat.com/rhel7/pod-infrastructure:latest
而後刪除pod 從新建立
kubectl delete -f mysql.yaml
kubectl create -f mysql.yaml
二、pod沒法刪除排查
https://www.58jb.com/html/155.html
三、etcd簡單操做
ls 查看
get 獲取key的值
rm 刪除key
更多的參考 etcdctl help