安装 K8s v18.4
准备两台机器,一台做master,一台做node
1.配置yum源(两台机器都做)
cd /etc/yum.repos.d/
rm -f \*
curl -o CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
curl -o docker-ce.repo https://download.docker.com/linux/centos/docker-ce.repo
cat < /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
2.安装docker并设置开启启动(两台机器都做)yum install -y docker-ce
systemctl enable docker && systemctl start docker
3.安装kubeadm并设置开启启动,实际上是会自动安装kubelet、kubeadm、kubectl三个(两台机器都做)yum install -y kubeadm
systemctl enable kubelet && systemctl start kubelet
4.初始化kubeadm(只在master机器执行),注意apiserver-advertise-address的ip改成自己的master节点ip,最好ping一下看看有没有通,复制最后的kubeadm join 192.168.71.60:6443 --token...后续会用到kubeadm init --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address=192.168.71.60 --image-repository mirrorgcrio --service-cidr=10.1.0.0/16
这里有个很诡异的BUG,笔者曾经困住这一步好几天,就是这个问题https://github.com/kubernetes...
新版本的移除了kubernetes-cni组件,但是新版本国内镜像较少,于是需要下老版本,但是老版本又说没有这个kubernetes-cni,导致很尴尬。最后找到了个能用的镜像mirrorgcrio仓库终于下好了。
5.执行完上面命令后,根据输出提示执行下面语句(只在master机器执行mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config
6.安装网络插件(master)
下载文件
https://github.com/WillLiaowh...
执行文件kubectl apply -f kube-flannel.yml
7.将node加入集群,token要根据上面4步骤安装完的提示(在node上操作)
kubeadm join 192.168.71.60:6443 --token y58e7a.c938uwuaz1fbeeys \
--discovery-token-ca-cert-hash sha256:fc18a5172423e70b915158ea34a2101284b3ee98c86cba79bcafadb691f75942
8.查看node,看到master节点和node节点都是ready就对了kubectl get node
部署微服务
这里笔者准备了三个微服务,一个consumer,一个provider,一个eureka,目的是consumer和provider都注册进eureka,最后实现从consumer调起provider的接口。
通常将一个服务部署到k8s的流程是这样的:
1.用Maven打包成jar
2.生成docker镜像
3.将生成的镜像push到docker镜像库
4.用kubectl将镜像发布到K8S集群
这里笔者直接用eureka来举例,后续的consumer和provider都是一样的部署流程。
1.Maven打出一个微服务的可执行jar
2.生成docker镜像,首先编辑一个Dokerfile
FROM hub.c.163.com/library/java:latest
ADD cloud-eureka-server7001-1.0-SNAPSHOT.jar eureka7001.jar
EXPOSE 7001
ENTRYPOINT ["java", "-jar", "/eureka7001.jar"]
将jar和Dokerfile放在同一个层级目录,执行
docker build -t eureka7001:0.0.1 .
3.将生成的镜像push到docker镜像库,这里我用了阿里云的镜像服务,主要方便,不用搞那么多有的没的
步骤是
3.1.登录 docker login
3.2.改tag docker tag
3.3.push到镜像仓库 docker push
最终效果是这样:
4.用kubectl将镜像发布到K8s集群,首先编辑一个Deployment.yaml文件
apiVersion: apps/v1
kind: Deployment
metadata:
name: eureka7001
labels:
app: eureka7001
spec:
replicas: 1
selector:
matchLabels:
app: eureka7001
template:
metadata:
labels:
app: eureka7001
spec:
containers:
- name: eureka7001
image: registry.cn-hangzhou.aliyuncs.com/willliaowh/eureka7001:0.0.1
ports:
- containerPort: 7001
---
kind: Service
apiVersion: v1
metadata:
name: eureka7001
labels:
app: eureka7001
spec:
selector:
app: eureka7001
ports:
- port: 7001
targetPort: 7001
"Deployment.yaml" 38L, 620C
注意image要改成自己的镜像地址,然后执行以下命令kubectl apply -f Deployment.yaml
一切顺利的话可以执行下面命令,看到eureka已经运行起来了kubectl get svc,deploy,pod
后续的consumer和provider都是一样的部署流程,要注意的是eureka的注册地址是kubectl get svc看到的CLUSTER-IP + Port,听说直接用服务名 + port也可以。
安装ingress
一切顺利的话三个服务应该都部署成功
但现在问题是怎么访问,这就需要用到ingress做一个反向代理访问service。
1.下载文件,我已经将配置调整好为hostNetwork方式访问https://github.com/WillLiaowh...
2.执行命令kubectl apply -f mandatory.yaml
3.编辑一个test-ingress.yaml文件用来暴露服务
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: test-ingress
spec:
rules:
- host: liaowh.com
http:
paths:
- path: /consumer
backend:
serviceName: consumer8007
servicePort: 8007
- path: /
backend:
serviceName: eureka7001
servicePort: 7001
4.执行命令kubectl apply -f test-ingress.yaml
5.编辑自己电脑的host文件,将node节点的ip和上面的host做一个映射,目的是为了在浏览器能直接访问。
6.liaowh.com直接访问到eureka主页,liaowh.com/consumer+接口名直接访问到consumer服务下的接口继而访问到provider服务接口