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