这个教程就当是给过去半年做个总结吧,从第一步创建虚拟机开始,该集群用了三台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
slave2 Ready
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