【系統運維】Centos7 搭建kubernetes(K8S)操作手冊

準備工作:

一、開通雲服務器

建站首先要有服務器和域名,對於個人使用的小型網站,一臺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

10.0.93.141 minion02

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

#yum makecache

二、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

sudo systemctl enable 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.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章