準備工作:
一、開通雲服務器
建站首先要有服務器和域名,對於個人使用的小型網站,一臺1核CPU|2G內存|1M帶寬|40G系統盤的雲服務器ECS實例即可滿足需要。目前國內主流雲服務提供商爲阿里雲、騰訊雲。
這裏展示以阿里雲爲例,騰訊雲也是大同小異的,如何開通雲服務器這裏略過,見“如何快速搭建自己獨立的個人博客?”文章有詳情介紹;
Kubernetes 簡介:
Kubernetes 是 Google 開源的基於 Docker 的容器集羣管理系統,通過 yaml 語言寫的配置文件,簡單快速的就能自動部署好應用環境,支持應用橫向擴展,並且可以組織、編排、管理和遷移這些容器化的應用
一、環境要求
需要rhel7/centos7及以上版本 ,內核3.10及以上。
系統版本 |
主機名 |
IP地址 |
服務 |
RHEL7.2 |
master01 |
10.0.93.205 |
apiserver,etcd,controler,scheduler |
RHEL7.2 |
minion01 |
10.0.93.1 |
aroxy,kubelet,flanneld |
RHEL7.2 |
minion02 |
10.0.93.141 |
aroxy,kubelet,flanneld |
CentOS6.6 |
宿主機 |
10.0.93.168 |
Yum源,KVM宿主機 |
系統環境配置:基礎系統環境配置需要在所有節點kubernetes進行配置。
1.1)、NTP配置
如內網無法訪問公網,則需要單獨配置一臺NTP服務器用作時間同步;如可以訪問直接使用公網的NTP服務器。
a)、該設備能通公網:
NTP服務器中默認配置有公網NTP地址。
#yum install -y ntp
#systemctl start ntpd
#systemctl enable ntpd
b)、該設備不能通公網:
添加內網NTP服務器地址至NTP配置文件中
#yum install -y ntp
#echo “server 10.0.93.168” >>/etc/ntp.conf # 10.0.93.168爲內網NTP服務器
#systemctl start ntpd
#systemctl enable ntpd
1.2)、DNS配置
修改/etc/hosts添加IP到主機名的解析:
# cat /etc/hosts
10.0.93.205 master01
10.0.93.1 minion01
1.3)、防火牆配置
關閉防火牆:
注意:關閉防火牆暫時對Kubernetes網絡架構影響,後續有待觀察。
#systemctl stop firewalld.service
#systemctl disable firewalld.service
#systemctl stop iptables.service
#systemctl disable iptables.service
1.4)、YUM源設置
本文提供基於rpm的yum安裝方式,需要事先緩存好kubernetes環境需要的所有安裝包,並且在內網環境中製作成yum源(本例中yum源是168)。方法如下:
將緩存的包上傳至/var/ftp/pub/k8s/
從上傳的軟件包中安裝vsftpd
#rpm -ivh vsftpd-3.0.2-10.el7.x86_64.rpm
#systemctl start vsftpd
默認情況下是允許匿名登錄的,目錄是:/var/ftp/
從上傳的軟件包中安裝yum源製作命令
#rpm -ivh createrepo-0.9.9-23.el7.noarch.rpm
把需要安裝的rpm包放在/var/ftp/pub/目錄下,執行yum源製作命令
createrepo /var/ftp/pub/k8s/
新增 /etc/yum.repos.d/k8s.repo 增加以下內容
[k8s]
name=k8s
baseurl=ftp://10.0.93.168/pub
enabled=1
gpgcheck=0
增加yum源後,執行下面兩句,重新緩存rpm元數據
#yum clean all
二、K8S master 安裝配置
2.1)、安裝k8s軟件包 ,K8S可以通過多種方式安裝,此文檔提供yum方法安裝。
sudo yum -y install --enablerepo=k8s docker-selinux
sudo yum -y install --enablerepo=k8s docker
sudo yum -y install --enablerepo=k8s socat
sudo yum -y install --enablerepo=k8s flannel
sudo yum -y install --enablerepo=k8s ntp
sudo yum -y install --enablerepo=k8s ntpdate
sudo yum -y install --enablerepo=k8s kubernetes-node
sudo yum -y install --enablerepo=k8s kubernetes-client
sudo yum -y install --enablerepo=k8s kubernetes-master
sudo yum -y install --enablerepo=k8s kubernetes
sudo yum -y install --enablerepo=k8s etcd
2.2)、軟件配置
a)、配置docker
修改docker配置文件,允許遠程訪問:
sudo sed -i "/OPTIONS/c OPTIONS='--insecure-registry 10.0.93.205:5000 --selinux-enabled -H tcp://0.0.0.0:28015 -H unix://var/run/docker.sock'" /etc/sysconfig/docker
注意:--insecure-registry 後面跟的是私用倉庫地址,根據實際部署情況修改。
啓動docker
sudo systemctl restart docker
b)、配置k8s
修改k8s apiserver文件
sudo sed -i "/KUBE_API_ADDRESS/c KUBE_API_ADDRESS=\"--address=0.0.0.0\"" /etc/kubernetes/apiserver
sudo sed -i "/# KUBE_API_PORT/c KUBE_API_PORT=\"--port=8080\"" /etc/kubernetes/apiserver
sudo sed -i "/# KUBELET_PORT/c KUBELET_PORT=\"--kubelet_port=10250\"" /etc/kubernetes/apiserver
sudo sed -i "/KUBE_ETCD_SERVERS/c KUBE_ETCD_SERVERS=\"--etcd_servers=http://master01:2379\"" /etc/kubernetes/apiserver
sudo sed -i "/KUBE_ADMISSION_CONTROL/c KUBE_ADMISSION_CONTROL=\"--admission_control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ResourceQuota\"" /etc/kubernetes/apiserver
修改k8s etcd文件
sudo sed -i "/ETCD_LISTEN_CLIENT_URLS/c ETCD_LISTEN_CLIENT_URLS=\"http://0.0.0.0:2379\"" /etc/etcd/etcd.conf
sudo sed -i "/ETCD_ADVERTISE_CLIENT_URLS/c ETCD_ADVERTISE_CLIENT_URLS=\"http://localhost:2379\"" /etc/etcd/etcd.conf
修改k8s flanneld文件
sudo sed -i "/FLANNEL_ETCD=/c FLANNEL_ETCD=\"http://127.0.0.1:2379\"" /etc/sysconfig/flanneld
sudo sed -i "/FLANNEL_ETCD_KEY=/c FLANNEL_ETCD_KEY=\"/coreos.com/network\"" /etc/sysconfig/flanneld
2.3)、啓動K8S服務:
啓動master上運行的服務
for SERVICES in etcd kube-apiserver kube-controller-manager kube-scheduler ; do
systemctl restart $SERVICES
systemctl enable $SERVICES systemctl status $SERVICES
Done
設置flanneld的IP段,重新啓動flanneld
sudo etcdctl mk /coreos.com/network/config '{"Network":"172.17.0.0/16"}'
sudo systemctl restart flanneld
sudo systemctl enable flanneld
sudo systemctl status flanneld
三、K8S minion 安裝配置
3.1)、yum安裝minion
sudo yum -y install --enablerepo=k8s docker-selinux
sudo yum -y install --enablerepo=k8s docker
sudo yum -y install --enablerepo=k8s socat
sudo yum -y install --enablerepo=k8s flannel
sudo yum -y install --enablerepo=k8s ntp
sudo yum -y install --enablerepo=k8s ntpdate
sudo yum -y install --enablerepo=k8s kubernetes-node
sudo yum -y install --enablerepo=k8s kubernetes-client
sudo yum -y install --enablerepo=k8s kubernetes-master
sudo yum -y install --enablerepo=k8s kubernetes
sudo yum -y install --enablerepo=k8s etcd
3.2)、軟件配置
a)、配置docker
修改docker配置文件,允許遠程訪問
sudo sed -i "/OPTIONS/c OPTIONS='--insecure-registry 10.0.93.205:5000 --selinux-enabled -H tcp://0.0.0.0:28015 -H unix://var/run/docker.sock'" /etc/sysconfig/docker
注意:--insecure-registry 後面跟的是私用倉庫地址,根據實際部署情況修改。
啓動docker
sudo systemctl restart docker
sudo systemctl enable docker
b)、配置config
sudo echo "KUBE_ETCD_SERVERS=\"--etcd_servers=http://DSJ-signal-900G-98:2379\"" >> /etc/kubernetes/config
sudo sed -i "/KUBE_ALLOW_PRIV/c KUBE_ALLOW_PRIV=\"--allow_privileged=false\"" /etc/kubernetes/config
sudo sed -i "/KUBE_MASTER/c KUBE_MASTER=\"--master=http://DSJ-signal-900G-100:8080\"" /etc/kubernetes/config
c)、配置kbelet
sudo sed -i "/KUBELET_ADDRESS/c KUBELET_ADDRESS=\"--address=0.0.0.0\"" /etc/kubernetes/kubelet
sudo sed -i "/# KUBELET_PORT/c KUBELET_PORT=\"--port=10250\"" /etc/kubernetes/kubelet
sudo sed -i "/KUBELET_HOSTNAME/c KUBELET_HOSTNAME=\"--hostname_override=DSJ-signal-900G-98\"" /etc/kubernetes/kubelet
sudo sed -i "/KUBELET_API_SERVER/c KUBELET_API_SERVER=\"--api_servers=http://DSJ-signal-900G-100:8080\"" /etc/kubernetes/kubelet
sudo sed -i "/KUBELET_ARGS/c KUBELET_ARGS=\"--pod-infra-container-image=DSJ-signal-900G-100:5000/pause:0.8.0\"" /etc/kubernetes/kubelet
d)、配置flaneld
sudo sed -i "/FLANNEL_ETCD=/c FLANNEL_ETCD=\"http://DSJ-signal-900G-100:2379\"" /etc/sysconfig/flanneld
sudo sed -i "/FLANNEL_ETCD_KEY=/c FLANNEL_ETCD_KEY=\"/coreos.com/network\"" /etc/sysconfig/flanneld
e)、啓動K8S服務
for SERVICES in kube-proxy kubelet docker flanneld; do
systemctl restart $SERVICES
systemctl enable $SERVICES
systemctl status $SERVICES
f)、設置docker的IP,重啓docker
注意:這一步必須在所有minion進行設置,flannel類似交換機功能,互聯各個docker0上的網橋,每個網橋IP地址段是不一樣的。這樣才能保證每個pod IP地址的唯一性
sudo flanneldIp=$(ip a | grep flannel | grep inet | awk '{print $2}' | awk -F '/' '{print $1}')
sudo ifconfig docker0 ${flanneldIp/.0/.1} netmask 255.255.255.0
sudo systemctl restart docker
sudo systemctl enable docker
3.3)、k8s集羣部署DNS服務
a)、修改每個minion的/etc/kubernetes/kubelet配置文件
KUBELET_ARGS="--cluster-dns=10.254.100.100 --cluster-domain=cluster.local --pod-infra-container-image=172.16.71.169:5000/pause:0.8.0"
注:cluster-dns的值與skydns-svc.yaml文件中的值必須一致,並且DNS的網段必須跟定義service網段一致,本例中,APIserver 定義service 爲10.254網段。
KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=10.254.0.0/16"
重啓kubelet服務
systemctl restart kubelet
上傳yaml文件到master節點的/etc/kubernetes/yaml
[root@master01 yaml]# pwd
/etc/kubernetes/yaml
[root@master01 yaml]# ll
total 0
drwxrwxr-x 4 root root 44 Feb 24 11:18 influxdb
drwxrwxr-x 2 root root 74 Feb 24 14:42 kube-ui
drwxrwxr-x 2 root root 68 Feb 25 10:59 skydns
啓動dns服務 進入到dns的配置文件目錄下,執行:
kubectl create-f /etc/kubernetes/yaml/kube-ui/kube-system.yaml
kubectl create -f /etc/kubernetes/yaml/skydns/skydns-rc.yaml
kubectl create -f /etc/kubernetes/yaml/skydns/skydns-svc.yaml
kubectl create -f /etc/kubernetes/yaml/skydns/busybox.yaml
注意:先執行RC文件,再執行SVC文件,這個是kubernetes架構要求的,先後順序不能亂。
b)、驗證DNS功能
#kubectl exec busybox -- nslookup kubernetes.default.svc.cluster.local
Server: 10.254.100.100
Address 1: 10.254.100.100
Name: kubernetes.default.svc.cluster.local
Address 1: 10.254.0.1
四、常見問題:
問題一:
localhost kube-apiserver: E1126 21:52:06.697708 1963 server.go:454] Unable to generate self signed cert: open /var/run/kubernetes/apiserver.crt: permission denied
處理:
# vi /usr/lib/systemd/system/kube-apiserver.service
[Service]
#在service下面添加以下內容。
PermissionsStartOnly=true
ExecStartPre=-/usr/bin/mkdir /var/run/kubernetes
ExecStartPre=/usr/bin/chown -R kube:kube /var/run/kubernetes/
# systemctl daemon-reload
# systemctl restart kube-apiserver
問題二:
Nov 26 21:52:06 localhost kube-apiserver: E1126 21:52:06.697818 1963 server.go:464] Unable to listen for secure (open /var/run/kubernetes/apiserver.crt: no such file or directory); will try again.
處理:# vim /etc/kubernetes/apiserver
KUBE_API_ARGS="--secure-port=0"
在KUBE_API_ARGS加上--secure-port=0參數。
原因如下:
--secure-port=6443: The port on which to serve HTTPS with authentication and authorization. If 0, don't serve HTTPS at all.