从创建虚拟机起搭建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,如图:

从创建虚拟机起搭建k8s和istio集群_第1张图片

输入命令:service network restart

1.3 打开xshell,连接虚拟机

由于是nat连接,本机电脑是连不到虚拟机的,所以修改本机的网络适配器——vnet

从创建虚拟机起搭建k8s和istio集群_第2张图片

将ip地址改为与虚拟机同一网段,并输入DNS。

设置好后,连接即可:

从创建虚拟机起搭建k8s和istio集群_第3张图片

之前连接失败就是因为没有设置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       34m     v1.13.3
slave2   Ready       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 delete -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

 

 

 

你可能感兴趣的:(k8s)