1. 程式人生 > >centos安裝kubernetes,calico,nfs

centos安裝kubernetes,calico,nfs

kubernetes+calico+nfs環境部署

原作者 張偉@天雲軟體,轉載請註明出處

主機說明:

  • 系統版本:centos7.2,Linux kernel 3.10.0及以上版本。
  • 系統規格:>=4CPU,>=4GRAM,120G磁碟(使用lvm管理,可動態擴容)。

主機規劃:

角色 主機名 IP 說明
master,etcd master 172.16.10.2 etcd,kubernetes(apiserver,scheduler,controller-manager),calico
minion minion1 172.16.10.3 kubernetes(kubelet,proxy),docker,calico
minion minion2 172.16.10.4 kubernetes(kubelet,proxy),docker,calico
registry registry 172.16.10.5 registry
nfsserver nfsserver 172.16.10.6 nfs-server

軟體:

  • etcd v2.2.5
  • docker v1.9.1
  • kubernetes二進位制包(安裝完成後可替換二進位制包進行升級):
    • kubectl v1.2.0
    • kubelet v1.2.0
    • kube-proxy v1.2.0
    • kube-scheduler v1.2.0
    • kube-controller-manager v1.2.0
    • kube-apiserver v1.2.0
    • registry.access.redhat.com/rhel7/pod-infrastructure:latest(映象)
  • calico:
    • calicoctl v0.18.0
    • calico/node:v0.18.0 (映象)
    • calico v1.1.0
    • calico-ipam v1.1.0
    • calico/k8s-policy-agent:v0.1.2 (映象)
    • policy
  • easyrsa3

安裝kubernetes叢集

1.準備安裝源
建議使用阿里源替換系統自帶的源
配置kubernetes安裝源
關閉selinux: setenforce 0

2.安裝kubernetes master節點
yum install kubernetes etcd -y 安裝kubernetes的所有服務。

1)配置crt通訊證書
1.1) 配置apiserver crt證書:
下載easyrsa3:
curl -L -O https://storage.googleapis.com/kubernetes-release/easy-rsa/easy-rsa.tar.gz
tar xzf easy-rsa.tar.gz
cd easy-rsa-master/easyrsa3
./easyrsa init-pki
建立CA:
./easyrsa --batch "--req-cn=${MASTER_IP}@`date +%s`" build-ca nopass  (如果要使用預設的service訪問kubernetes叢集,使用--req-cn=*)
生成服務使用的cert和key:
./easyrsa --subject-alt-name="IP:${MASTER_IP}" build-server-full kubernetes-master nopass(如果要使用預設的service訪問kubernetes叢集,要在IP後邊配置service的IP:IP:${MASTER_IP},IP:${SERVICE_IP})*
mkdir -p /srv/kubernetes  
cp pki/ca.crt /srv/kubernetes/
cp pki/issued/kubernetes-master.crt /srv/kubernetes/server.cert  
cp pki/issued/kubernetes-master.key /srv/kubernetes/server.key

1.2)配置ServiceAccount:
openssl genrsa -out /srv/kubernetes/serviceaccount.key 2048

chmod +x /srv/kubernetes/*

2)配置etcd服務
vi /etc/etcd/etcd.conf
修改etcd監聽的網絡卡和埠,使服務能夠在叢集內訪問。

systemctl enable etcd
systemctl restart etcd  

3)配置apiserver
vi /etc/kubernetes/config
將KUBE_MASTER的值修改為正確的IP地址。
# logging to stderr means we get it in the systemd journal  
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=true"

# How the controller-manager, scheduler, and proxy find the apiserver
KUBE_MASTER="--master=http://master:8080"

vi /etc/kubernetes/apiserver
修改apiserver監聽的網絡卡和埠,並配置使用的etcd叢集。注意增加apiserver的證書設定。
# The address on the local server to listen to.
KUBE_API_ADDRESS="--insecure-bind-address=0.0.0.0"

# The port on the local server to listen on.
# KUBE_API_PORT="--port=8080"
KUBE_API_PORT="--insecure-port=8080"
# Port minions listen on
# KUBELET_PORT="--kubelet-port=10250"

# Comma separated list of nodes in the etcd cluster
KUBE_ETCD_SERVERS="--etcd-servers=http://master: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=/srv/kubernetes/ca.crt --tls-cert-file=/srv/kubernetes/server.crt --tls-private-key-file=/srv/kubernetes/server.key --service_account_key_file=/srv/kubernetes/serviceaccount.key"


4)配置controller-manager
vi /etc/kubernetes/controller-manager
增加證書設定
# Add your own!
KUBE_CONTROLLER_MANAGER_ARGS="--root-ca-file=/srv/kubernetes/ca.crt --service_account_private_key_file=/srv/kubernetes/server.key"

5)啟動master上的服務

for SERVICES in etcd kube-apiserver kube-controller-manager kube-scheduler; do 
    systemctl restart $SERVICES
    systemctl enable $SERVICES
    systemctl status $SERVICES done

3.安裝kubernetes minion節點
yum install kubernetes -y

1)配置kubelet
vi /etc/kubernetes/config
將KUBE_MASTER的值修改為正確的IP地址。
# logging to stderr means we get it in the systemd journal
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=true"

# How the controller-manager, scheduler, and proxy find the apiserver
KUBE_MASTER="--master=http://master:8080"

vi /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=0.0.0.0"

# 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=${YOUR_HOST_NAME}"

# location of the api-server
KUBELET_API_SERVER="--api-servers=http://master:8080"

# pod infrastructure container
KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-    image=registry.access.redhat.com/rhel7/pod-infrastructure:latest"

# Add your own!
KUBELET_ARGS=""

2)配置kube-proxy
vi /etc/kuerbnetes/proxy,可以配置proxy模式
# Add your own!
KUBE_PROXY_ARGS=" --proxy-mode=iptables"

3)啟動minon上的服務
for SERVICES in kube-proxy kubelet docker; do 
    systemctl restart $SERVICES
    systemctl enable $SERVICES
    systemctl status $SERVICESdone

4.檢查kubernetes 叢集狀態
等服務啟動完成後,在master節點上檢查叢集狀況。測試環境上master上也部署了成了minion節點。

[[email protected] ~]# kubectl get nodes  
NAME      LABELS                           STATUS    AGE
master    kubernetes.io/hostname=master    Ready     6d
minion1   kubernetes.io/hostname=minion1   Ready     6d
minion2   kubernetes.io/hostname=minion2   Ready     6d

安裝Calico

1.節點安裝calico (使用v0.18.0版本)

wget -o /usr/bin/calicoctl https://github.com/projectcalico/calico-containers/releases/download/v0.18.0/calicoctl  
chmod +x /usr/bin/calicoctl  

建立檔案/etc/systemd/calico-node,設定etcd叢集服務地址:

[Unit]  
Description=calicoctl node  
After=docker.service  
Requires=docker.service  
[Service]     
User=root
Environment=ETCD_AUTHORITY=master:4001
PermissionsStartOnly=true
ExecStart=/usr/bin/calicoctl node --detach=false
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.target

將calico-node配置成開機啟動服務,並啟動。
在環境變數中增加ETCD_AUTHORITY=master:4001的配置

systemctl enable /etc/systemd/calico-node.service
service calico-node restart  

將會使用映象calico/node:v0.18.0,啟動服務。

2.在所有minion節點上,安裝calico-cni擴充套件

wget -N -P /opt/cni/bin https://github.com/projectcalico/calico-cni/releases/download/v1.1.0/calico chmod +x /opt/cni/bin/calico
wget -N -P /opt/cni/bin https://github.com/projectcalico/calico-cni/releases/download/v1.1.0/calico-ipam
chmod +x /opt/cni/bin/calico-ipam  

配置cni網路宣告:

$ cat /etc/cni/net.d/10-calico.conf
{
    "name" : "calico-k8s-network",
    "type" : "calico",
    "etcd_authority" : "master:4001",
    "log_level" : "info",
    "ipam" : {
        "type" : "calico-ipam"
    }
}

如果是在阿里雲上部署,需要設定calico使用ipip,用如下命令檢視:

calicoctl pool show --ipv4

如果顯示

+----------------+-------------------+
|   IPv4 CIDR    |      Options      |
+----------------+-------------------+
| 192.168.0.0/16 | ipip,nat-outgoing |
+----------------+-------------------+

表示已啟用ipip,否則根據提示刪除ip池,重新新增並使用選項–ipip –nat-outgoing。

檢視預設規則是否正確:

calicoctl profile calico-k8s-network rule show

如果顯示

Inbound rules:
    1 allow
Outbound rules:
    1 allow

表示預設規則正確。

驗證網路環境是否滿足kubernetes需求:
1) 建立一個rc,副本數量和叢集的minion節點一致。
2) 測試主機到pod通訊:主機 ping 本機PodIp, 主機ping 其它主機PodIp。Pod內部ping宿主機Ip,Pod內部ping其它主機Ip。
3) 測試cluster ip通訊:建立service,後端使用可用的Pod服務。在Pod所在minion,使用serviceIp+port訪問服務。在其它minion,使用serviceIp+port訪問服務。
4) 測試nodePort通訊:使用minion本機IP+nodeport訪問服務。使用其它minion ip+nodeport訪問服務。
如果以上測試全部通過,則網路配置正確,否則需要排查問題。
如果排查後配置全部正確,但是kubermetes網路某些環節不通,可以在所有節點執行:

calicoctl node

命令,重新初始化calico網路的連結。

3.部署policy-agent
使用下面的yaml檔案部署policy-agent,其機制為監聽kubernetes 中pod和namespace的變化,namespace中network policy的配置變化,有policy-agent寫入到calico的etcd儲存中,然後直接由每個節點上的felix轉換為iptables規則。

apiVersion: v1
kind: Namespace
metadata:
  name: calico-system
---
apiVersion: v1
kind: ReplicationController
metadata:
  name: calico-policy-agent
  namespace: calico-system
  labels:
    version: v0.1.2
    projectcalico.org/app: "policy-agent"
spec:
  replicas: 2
  selector:
    version: v0.1.2
    projectcalico.org/app: "policy-agent"
  template:
    metadata:
      labels:
        version: v0.1.2
        projectcalico.org/app: "policy-agent"
    spec:
      containers:
        - name: policyagent
          image: 172.16.10.5:5000/calico/k8s-policy-agent:v0.1.2
          imagePullPolicy: IfNotPresent
          env:
          - name: ETCD_ENDPOINTS
            value: "http://172.16.10.2:2379"  

部署完成後,等待服務啟動。檔案中的env是讓pod使用環境變數方式訪問ETCD,如果kubernetes叢集中安裝了DNS,可以刪掉環境變數的設定,使用dns訪問ETCD服務。
在master節點上,policy用於操作network policy物件實現網路隔離的動態控制。

wget https://github.com/projectcalico/k8s-policy/releases/download/v0.1.1/policy
chmod +x ./policy

4.修改kubernetes配置
設定kube-proxy服務的proxy-mode配置為iptables,修改配置檔案/etc/kubernetes/proxy:

###
# kubernetes proxy config
# default config should be adequate
# Add your own!
KUBE_PROXY_ARGS=" --proxy-mode=iptables"

設定kubelet的network-plugin為cni,修改配置檔案/usr/lib/systemd/system/kubelet.service:

[Unit]
Description=Kubernetes Kubelet Server
Documentation=https://github.com/GoogleCloudPlatform/kubernetes
After=docker.service
Requires=docker.service
[Service]
WorkingDirectory=/var/lib/kubelet
EnvironmentFile=-/etc/kubernetes/config
EnvironmentFile=-/etc/kubernetes/kubelet
ExecStart=/usr/bin/kubelet \
--network-plugin-dir=/etc/cni/net.d \
--network-plugin=cni \
$KUBE_LOGTOSTDERR \
$KUBE_LOG_LEVEL \
$KUBELET_API_SERVER \
$KUBELET_ADDRESS \
$KUBELET_PORT \
$KUBELET_HOSTNAME \
$KUBE_ALLOW_PRIV \
$KUBELET_POD_INFRA_CONTAINER \
$KUBELET_ARGS
Restart=on-failure
[Install]
WantedBy=multi-user.target

重啟相關服務:

service kubelet restart
service kube-proxy restart

安裝nfs服務

1.安裝nfs相關服務

yum install nfs-server  
yum install nfs  
yum install rpcbind nfs-utils

2.新增共享目錄

/share *(rw,insecure,sync,no_subtree_check,no_root_squash)
/mysql *(rw,insecure,sync,no_subtree_check,no_root_squash)

上述共享目錄的配置一定要寫上,否則在使用過程中可能出現Operation not permitted錯誤。

3.所有kubernetes minion節點安裝nfs工具

yum install rpcbind nfs-utils
  • 整體測試

常見問題及解決方案

1.kubernetes dns服務異常

首先檢視kubelet是否配置正確,安裝dns需要在所有節點的kubelet啟動引數中增加

--cluster-dns=10.254.0.3 --cluster-domain=cluster.local

引數。

其次檢視dns版本,確定kube2sky和kubernetes api通訊的方式,老版本的(如v9版本),需要在yaml檔案中指定kubernetes apiserver的地址和埠。新版本的(如v11版本),使用kubernetes預設的kubernetes service訪問kubernetes。如果是新版本,請參考 配置crt通訊證書 一節,修改crt證書生成方式。 如果是老版本,確定kubernetes的網路是否配置正確。

2.pv和pvc繫結失敗
pv和pvc匹配要檢查以下幾點:
1) pv和pvc的標籤是否一致。
2) pv和pvc的大小是否滿足要求,pvc的容量要求不能大於pv的容量。
3) pv和pvc的accessModes必須相同。

3.mysql容器使用nfs啟動不了
檢視mysql對應Pod的日誌,如果出現Operation not permitted錯誤,是因為nfs設定的共享目錄許可權不足,在共享目錄設定中增加no_root_squash設定。

4.kubernetes https訪問許可權問題
訪問Pod中服務可能會報以下錯誤:

x509: cannot validate certificate for x.x.x.x because it doesn't contain any IP SANs

這個是因為沒有設定或者設定的證書出錯,參考 配置crt通訊證書 重新生成證書,修改配置即可。

5.guestbook服務寫資料無響應
這個是因為guestbook要使用的angular.min.js需要翻牆才能使用,可以把js檔案下載到本地,重新生成映象。

6.cassandra服務無法訪問kubernetes api
v6版本的cassandra使用的SeedProvider有BUG,使用的預設的服務域名為

kubernetes.default.cluster.local

正確的應該是

kubernetes.default.svc.cluster.local

這個只能通過重新編譯原始碼,打包映象解決。
v7版本的映象因許可權問題cassandra啟動指令碼執行失敗。沒有深入研究解決方法。
v8版本已經解決了上述問題,但是沒有找到可以使用的映象。

7.nslookup解析正常,不能用域名訪問服務
檢視主機的/etc/resolv.conf檔案,如果存在類似記錄則刪除掉:

options timeout:1 attempts:1 rotate

8.問題排查方法
1) kubectl describe pod POD_NAME –namespace=NAME_SPACE檢視Pod的事件及基本資訊。如下載映象失敗等問題都可以從這塊定位出來。
2) kubectl logs POD_NAME –namespace=NAME_SPACE檢視Pod的日誌,定位服務本身的問題,具體問題具體分析。
3) 在Pod內部訪問kubernetes apiserver有兩種方式。
一種是指定apiserver的地址和埠,如果使用這種方式訪問失敗,比如timeout,可以從叢集網路環境入手排查問題。
另一種是使用kubernetes的預設service訪問,這種訪問方式使用的是https,並且依賴於叢集dns服務。如果出現問題,先排查叢集的dns服務是否安裝正確。建立busybox Pod,執行

kubectl exec busybox nslookup kubernetes.default.svc.cluster.local --namespace=kube-system

Server:    10.254.0.3
Address 1: 10.254.0.3

Name:      kubernetes.default.svc.cluster.local
Address 1: 10.254.0.1

如果可以正確解析域名說明服務正常。

其次排查叢集crt證書是否配置正確。使用命令:

kubectl exec frontend-0ghx0 ls /var/run/secrets/kubernetes.io/serviceaccount/

檢視Pod內部證書和crt檔案。

9.kubernetes升級
centos源安裝的kubernetes有很多問題,可以使用官方release的版本升級kubernetes。升級方式是下載二進位制包,停止kubernetes服務,用下載的二進位制包替換老的二進位制包,重新啟動服務即可。

相關推薦

centos安裝kubernetescaliconfs

kubernetes+calico+nfs環境部署 原作者 張偉@天雲軟體,轉載請註明出處 主機說明: 系統版本:centos7.2,Linux kernel 3.10.0及以上版本。 系統規格:>=4CPU,>=4GRAM,120G磁

centos 安裝完Nginx後為什麼訪問不了?

很多時候,安裝完成後,服務也啟動了 但是訪問不了 看看是不是防火牆開啟了; 本地試下埠是否可訪問telnet 192.168.4.155 80 CentOS 7預設使用的是firewall作為防火牆,這裡改為iptables防火牆。 firewall: systemc

centos 安裝java到伺服器並執行部落格系統

申請一個乾淨的vps下面這個命令是 檢視可用的JDK軟體包列表yum search java | grep -i --color JDK繼續敲入命令(注意這裡面的版本的問題,你敲入的不一定跟我的版本是一樣的)yum install -y java-1.8.0-openjdk-

centos 安裝桌面啟動。

targe 每次 inittab min ln -s 如果 vim evel div 每次都百度,真麻煩,收集起來給自己看 三步搞定 安裝圖形界面 # yum groupinstall "GNOME Desktop" "Graphical Administr

VMware上安裝CentOS系統(本人新手歡迎大家多多指導和關照)

com top 寫入 部分 安裝目錄 des ide pan div 1.成功安裝VMware Workstation。 2.下載CentOS鏡像。 3.新建一個虛擬機。 4.選擇自定義安裝並單擊下一步(選擇自定義安裝是為了方便自己配置

CentOS7上安裝並配置KVM以及通過KVM安裝CentOS系統

KVM 虛擬機 CentOS7 虛擬化技術 筆記內容:CentOS7上安裝並配置KVM,以及通過KVM安裝CentOS系統筆記日期:2018-03-07 28.5 Centos7上安裝KVM 28.6 配置網卡 28.7 創建虛擬機安裝CentOS7 28.8 虛擬機管理 Centos7

如何在CentOS 7.2上創建NFS的Share然後讓Client可以訪問

ofo client IT for sha href setting and server 講得詳細清楚明白的好文。Setting Up an NFS Server and Client on CentOS 7.2https://www.howtoforge.com/tut

CentOS 7 需要安裝的常用工具centos安裝fcitx 搜狗輸入法的坑旅

spl gnome2 cloud 進入 load rhel 美化 任務 hit https://blog.csdn.net/tham_/article/details/41868831 Centos常用設置 1.當最大化時隱藏標題欄 或者使用tweak to

centos安裝成功後不能正常使用ifconfig命令

centos works 使用 ping too 命令 問題 fig net 環境:VMware Workstation 10系統:centos7 64位問題: 系統安裝成功後 不能正常使用ifconfig命令,能不能正常使用ping命令ping www.baidu.com

kubernetes 集群安裝etcd集群帶證書

cert key mod 信息 ise ESS linux con efi install etcd 準備證書 https://www.kubernetes.org.cn/3096.html 在master1需要安裝CFSSL工具,這將會用來建立 TLS ce

CentOS 7 下 PHP 7MySQL 5.7 和 Nginx 1.8 的安裝與配置(實用)

下面將一步步在 CentOS 7 下 PHP 7,MySQL 5.7 和 Nginx 1.8 的安裝與配置。首先我的 CentOS 版本是7.0.1406 [[email protected] ~]# lsb_release -a LSB Version:  

安裝istio的Bookinfo在kubeadm安裝kubernetes單節點叢集上

安裝叢集看這個 使用kubeadm安裝單節點kubernetes叢集,在vmware虛擬機器centos7 下載istio curl -L https://git.io/getLatestIstio | sh - cd istio-1.0.2 把當前目錄下bin,加入path

centOS安裝nodemysqlapache

一、安裝node 1、下載node二進位制安裝包 wget https://nodejs.org/dist/v10.13.0/node-v10.13.0-linux-x64.tar.xz 2、解壓 tar xvf node-v10.13.0-linux-x64.tar.xz 3、建立

CENTOS安裝nginx配置反向代理

安裝 yum install zlib zlib-devel openssl openssl-devel pcre pcre-devel gcc gcc-c++ autoconf automake ./configure --prefix=/usr/local/nginx --with-http_stub

CentOS 安裝Python3 pip3 centos7安裝python3.6和pip3

centos7安裝python3.6和pip3 1.yum -y install epel-release 2..執行成功之後,再次執行yum install python-pip 3.對安裝好的pip進行升級 pip install –upgrade pip (注意是兩個短橫線~~) 到這裡pip

CentOS 7安裝破解confluence6.10使用ldap登入

1.下載地址:https://×××w.atlassian.com/software/confluence/download wget  https://product-downloads.atlassian.com/software/confluence/downloads/atl

Centos安裝VMTools共享資料夾

    1.安裝VMware Tools(因為我安裝過了,所以顯示為重新安裝) 2、建立掛載點目錄 mkdir /mnt/cdrom 3、掛在光碟機 mount /dev/cdrom /mnt/cdrom 4、檢視掛在光

kubeadm原始碼分析(內含kubernetes離線包三步安裝)_Kubernetes中文社群

k8s離線安裝包 三步安裝,簡單到難以置信 kubeadm原始碼分析 說句實在話,kubeadm的程式碼寫的真心一般,質量不是很高。 幾個關鍵點來先說一下kubeadm乾的幾個核心的事: kubeadm 生成證書在/etc/kubernetes/pki目錄下 kubeadm 生成static

centos安裝kafka以及springboot的整合

下載kafkkafka,http://kafka.apache.org/downloads 我這裡下載的版本是 kafka-1.1.0,檔案: kafka_2.11-1.1.0.tgz 下載後上傳到/usr/local/kafka,並解壓。解壓後文件路徑

如何在window10下安裝FileZilla服務端然後虛擬機器vb下的centos訪問該伺服器?

知識點 一、Filezilla客戶端作用:  通過服務端提供的ip/username/password,連線服務端 可以將客戶端的檔案上傳到伺服器端事先設定後的共享目錄下(shared directory) 可以在客戶端瀏覽到共享目錄的檔案結構 可以將共享目錄中的檔案