從創建虛擬機起搭建k8s和istio集羣

這個教程就當是給過去半年做個總結吧,從第一步創建虛擬機開始,該集羣用了三臺centos 7虛擬機。

1. 創建centos 7虛擬機,並配置成爲一個合格的節點。

先創建一臺master,創建好的虛擬機需要設置網絡,這裏使用的是靜態網絡。

1.1 查看虛擬機網絡編輯器

打開vnet8的nat設置,查看網關。

1.2 在虛擬機中修改網絡配置文件,vi /etc/sysconfig/network-scripts/ifcfg-ens33

將BOOTPROTO修改爲static,ONBOOT修改爲yes,然後添加IPADDR,NETMASK,GATEWAY和DNS,如圖:

輸入命令:service network restart

1.3 打開xshell,連接虛擬機

由於是nat連接,本機電腦是連不到虛擬機的,所以修改本機的網絡適配器——vnet

將ip地址改爲與虛擬機同一網段,並輸入DNS。

設置好後,連接即可:

之前連接失敗就是因爲沒有設置vnet的ip。

1.4 修改yum源

install wget

備份本地yum源:mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup

獲取源配置文件:cd /etc/yum.repos.d/

wget http://mirrors.aliyun.com/repo/Centos-7.repo
mv Centos-7.repo CentOS-Base.repo

生成緩存並更新:yum makecache

                             yum -y update

1.5 我在後面搭建k8s集羣時遇到yum倉庫中docker ce 版本不夠,所以這裏先安裝下新版本

配置倉庫:yum install -y yum-utils device-mapper-persistent-data lvm2

                  yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

開啓edge和test倉庫:

yum-config-manager --enable docker-ce-edge

yum-config-manager --enable docker-ce-test

yum-config-manager --disable docker-ce-edge

yum-config-manager --disable docker-ce-test

安裝docker-ce:yum install docker-ce

2. 克隆虛擬機

2.1 克隆之後改網絡配置文件,將UUID這行刪除,修改IPADDR的IP,然後重啓網絡。ping master的IP,ping www.baidu.com能夠ping通,說明克隆成功。

2.2 分別修改三臺虛擬機的hostname爲master,slave1,slave2,並在 /etc/hosts中加上三個虛擬機的IP和對應的hostname,此時,ping虛擬機的hostname即可。

3. 搭建k8s集羣

3.1 準備:

       關閉swap分區:swapoff(臨時)/echo "vm.swappiness = 0">> /etc/sysctl.conf(儘可能不用)

     vim /etc/fstab 註釋掉swap那行(永久)

       關閉防火牆:1.systemctl stop firewalld  2.systemctl disable firewalld

       關閉SELINUX服務(SELinux 主要作用就是最大限度地減小系統中服務進程可訪問的資源(最小權限原則)):

1. sed -i 's/enforcing/disabled/' /etc/selinux/config    2. setenforce 0

3.2 下載kubernetes和docker的倉庫源

cd /etc/yum.repos.d/

wget  https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
wget https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg

rpm --import yum-key.gpg(導入密鑰)

編輯k8s倉庫配置文件:

[kubernetes]
name=Kubernetes Repo
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
enabled=1

將該配置文件傳送到另外兩臺虛擬機中:

scp -rp kubernetes.repo [email protected]:/etc/yum.repos.d/
scp -rp kubernetes.repo [email protected]:/etc/yum.repos.d/

3.3 在master上的配置

1)安裝kubeadm,kubectl,kubelet

yum install docker-ce kubeadm kubectl  kubelet -y

2)編輯docker.service:

vim /usr/lib/systemd/system/docker.service 
# for containers run by docker
# Environment="HTTPS_PROXY=http://www.ik8s.io:10080"
Environment="NO_PROXY=127.0.0.0/8,172.20.0.0/16"

3)啓動docker,並設置開機啓動docker和kubelet,

添加參數:

echo 1 > /proc/sys/net/bridge/bridge-nf-call-ip6tables
echo 1 > /proc/sys/net/bridge/bridge-nf-call-iptables

4)查看版本:rpm -qa kubelet,根據該版本下載鏡像

3.4 初始化

1)初始化前先拉取鏡像:

添加加速器:curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io

手動下載:

docker pull mirrorgooglecontainers/kube-apiserver:v1.13.3
docker pull mirrorgooglecontainers/kube-controller-manager:v1.13.3
docker pull mirrorgooglecontainers/kube-scheduler:v1.13.3
docker pull mirrorgooglecontainers/kube-proxy:v1.13.3
docker pull mirrorgooglecontainers/pause:3.1
docker pull mirrorgooglecontainers/etcd:3.2.24
docker pull coredns/coredns:1.2.6

改標籤:

docker tag mirrorgooglecontainers/kube-apiserver:v1.13.3  k8s.gcr.io/kube-apiserver:v1.13.3
docker tag mirrorgooglecontainers/kube-controller-manager:v1.13.3 k8s.gcr.io/kube-controller-manager:v1.13.3
docker tag mirrorgooglecontainers/kube-scheduler:v1.13.3 k8s.gcr.io/kube-scheduler:v1.13.3
docker tag mirrorgooglecontainers/kube-proxy:v1.13.3  k8s.gcr.io/kube-proxy:v1.13.3
docker tag mirrorgooglecontainers/pause:3.1 k8s.gcr.io/pause:3.1
docker tag mirrorgooglecontainers/etcd:3.2.24 k8s.gcr.io/etcd:3.2.24
docker tag coredns/coredns:1.2.6 k8s.gcr.io/coredns:1.2.6

然後可以選擇刪除之前手動;拉取的鏡像。

2)初始化:

kubeadm init --kubernetes-version=v1.13.3 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12 --ignore-preflight-errors=Swap

PS:初始化後失敗的處理:

kubeadm reset
ifconfig cni0 down
ip link pull cni0
ifconfig flannel.1 down
ip link pull flannel.1
rm -rf /var/lib/cni/

記住初始化出現的值,在節點加入集羣時要用。

根據提示創建文件,給予權限:

mkdir -p $HOME/.kubecd
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config

3)添加網絡

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

應用後,我的pod flannel的狀態一直是init,查看describe po後發現,一直在拉取鏡像,所以我kubectl delete -f

,手動拉取鏡像,然後再一次kubectl apply -f,查看pod狀態,running。

4)將配置的docker.service和kubelet文件分別傳送到兩個節點上

scp -rp /usr/lib/systemd/system/docker.service 192.168.217.101:/usr/lib/systemd/system/
scp -rp /usr/lib/systemd/system/docker.service 192.168.217.102:/usr/lib/systemd/system/
  
scp -rp  /etc/sysconfig/kubelet 192.168.217.101:/etc/sysconfig/
scp -rp  /etc/sysconfig/kubelet 192.168.216.102:/etc/sysconfig/

5)查看節點驗證:

kubectl get nodes,狀態應爲ready,如果爲not ready要檢查pod flannel的狀態。

3.5 加入節點

1)slave1 安裝docker kubeadm kubelet

yum install kubeadm  kubelet -y

2)加速器:curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io

3)重啓docker,開機啓動docker,kubelet

systemctl restart docker
systemctl enable docker
systemctl enable kubelet
echo 1 > /proc/sys/net/bridge/bridge-nf-call-ip6tables
echo 1 > /proc/sys/net/bridge/bridge-nf-call-iptables

4)下載鏡像

docker pull mirrorgooglecontainers/pause:3.1
docker pull mirrorgooglecontainers/kube-proxy:v1.13.3
docker tag mirrorgooglecontainers/pause:3.1 k8s.gcr.io/pause:3.1
docker tag mirrorgooglecontainers/kube-proxy:v1.13.3  k8s.gcr.io/kube-proxy:v1.13.3

5)加入集羣:

kubeadm join 192.168.217.100:6443 --token 1axxcc.6pjh3oy34vd3j6o0 --discovery-token-ca-cert-hash sha256:d29527b5d0fe3d436d11094a4fb537c1848a741e25654109994ef06f33332563 --ignore-preflight-errors=all 

這一步執行後,出現了個錯誤:kubelet-check:It seems like the kubelet isn't running or healthy.

檢查發現是kubelet的配置文件沒從master上成功傳送到節點上。

slave2節點同上。

3.6 最終全部檢測: kubectl get nodes

[root@master ~]# kubectl get nodes
NAME       STATUS   ROLES    AGE     VERSION
master     Ready    master   3h38m   v1.13.3
slave1   Ready    <none>   34m     v1.13.3
slave2   Ready    <none>   3m55s   v1.13.3

4. 搭建istiio集羣

4.1 下載istio安裝包

wget https://github.com/istio/istio/releases/download/1.0.3/istio-1.0.3-linux.tar.gz

解壓安裝:

tar xf istio-1.0.3-linux.tar.gz
mv istio-1.0.3 /usr/local
ln -sv /usr/local/istio-1.0.3/ /usr/local/istio

添加到PATH路徑中:

echo 'export PATH=/usr/local/istio/bin:$PATH' | sudo tee /etc/profile.d/istio.sh 

source /etc/profile.d/istio.sh

驗證安裝:istioctl version

4.2 配置istio

複製源文件,以防出錯時無法恢復

cp /usr/local/istio/install/kubernetes/istio-demo.yaml  /usr/local/istio/install/kubernetes/istio-demo.yaml.ori

由於實驗使用的虛擬機每臺只有2G內存,默認情況下 pilot 的 deployment 請求 2G 內存,爲了使實驗順利進行。
把13573行左右關於 istio-pilot 的內存配置修改成如下內容:

- name: PILOT_TRACE_SAMPLING
     value: "100"
    resources:
     requests:
      cpu: 500m
      memory: 300Mi

修改鏡像使用國內鏡像,加速部署,執行以下命令修改鏡像:

sed -i '[email protected]/coreos/hyperkube:[email protected]/gcr-k8s/hyperkube:v1.7.6_coreos.0@g' /usr/local/istio/install/kubernetes/istio-demo.yaml

4.3 部署istio創建 istio CRD:
kubectl apply -f /usr/local/istio/install/kubernetes/helm/istio/templates/crds.yaml -n istio-system

查看istio CRD:kubectl get crd

部署istio相關組件:kubectl apply -f /usr/local/istio/install/kubernetes/istio-demo.yaml 

查看 Istio 組件狀態,當組件全部處於 Running 或者 Completed 時再進行之後的實驗:

kubectl get svc -n istio-system
kubectl get pods -n istio-system

5. 部署官方bookinfo示例

5.1 開啓 default 命名空間的 Istio 自動注入功能:

kubectl label namespace default istio-injection=enabled

部署bookinfo:

kubectl apply -f /usr/local/istio/samples/bookinfo/platform/kube/bookinfo.yaml

查看狀態:

 kubectl get services
 kubectl get pods

使用gateway 創建訪問入口:

kubectl apply -f /usr/local/istio/samples/bookinfo/networking/bookinfo-gateway.yaml

查看gateway:kubectl get gateway

獲取訪問地址(沒有負載均衡功能,使用的nodeport暴露的端口):

export INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="http2")].nodePort}')
export SECURE_INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="https")].nodePort}')
export INGRESS_HOST=$(kubectl get po -l istio=ingressgateway -n istio-system -o 'jsonpath={.items[0].status.hostIP}')
export GATEWAY_URL=$INGRESS_HOST:$INGRESS_PORT
echo http://$GATEWAY_URL/productpage
curl -I http://$GATEWAY_URL/productpage
curl -o /dev/null -s -w "%{http_code}\n" http://${GATEWAY_URL}/productpage

使用瀏覽器訪問。

6. 部署kiali

下載並應用:

curl -sL http://git.io/getLatestKialiKubernetes | sed 's/create/apply/g' | bash

暴露端口:

KIALI_NODEPORT=$(kubectl get svc kiali -n istio-system -o jsonpath='{.spec.ports[0].nodePort}')
INGRESS_HOST=$(kubectl get node -o jsonpath='{.items[0].status.addresses[0].address}')
獲取地址:

echo "https://$INGRESS_HOST:$KIALI_NODEPORT/kiali/"

PS:清理緩存:sync; echo 3 > /proc/sys/vm/drop_caches

 

 

 

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