安装 k8s 集群
virtualbox + centos7 64位
网路设置:启用网络设置,配置 NAT (虚拟机访问外网)和 host-only(宿主机访问虚拟机) 网络
安装yum
工具
yum -y install yum-utils
关闭防火墙、selinux
和swap
# 关闭防火墙
systemctl stop firewalld & systemctl disable firewalld
# 关闭 selinux
setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config
# 关闭 swap
swapoff -a # 重启之后需要重新设置
sed -ri '/^[^#]*swap/s@^@#@' /etc/fstab # 永久修改
设置路由
yum install -y bridge-utils.x86_64
modprobe br_netfilter # 加载br_netfilter模块,使用lsmod查看开启的模块
cat <<EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system # 重新加载所有配置文件
安装docker
# 设置源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum makecache
# 查看全部 docker 版本
yum list docker-ce --showduplicates | sort -r
# 安装docker,这里安装的最新的
yum -y install docker-ce-20.10.6-3.el7
# 启动
systemctl start docker & systemctl enable docker
# 修改驱动
cat > /etc/docker/daemon.json <<EOF
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2",
"storage-opts": [
"overlay2.override_kernel_check=true"
]
}
EOF
# 重启docker
systemctl restart docker
k8s 安装
# 配置源
cat <<EOF > /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
# master 节点安装
yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
# 开机启动
systemctl enable --now kubelet # 开机启动kubelet
如果有多个节点,可以克隆前面的虚拟机,如果是克隆的方式,注意网卡如果是使用静态ip需要修改成不同的ip。
节点的配置流程:
- 修改每个节点的 hostname, 位于 /etc /hostname 配置中
- 修改 hosts,为每个 节点添加hosts
- 重启全部的节点
上面的操作全部的节点都需要执行一次,以下的操作只需要在master节点上操作。
初始化:
先查看虚拟机的ip,如果是 192.168.x.x
,将 service-cidr
和pod-network-cidr
设置成 10.0.x.x
网,避免冲突。
kubeadm init --kubernetes-version=1.21.1 --apiserver-advertise-address=192.168.56.111 --image-repository registry.cn-hangzhou.aliyuncs.com/google_containers --service-cidr=10.1.0.0/16 --pod-network-cidr=10.244.0.0/16
coredns 可能会下载失败,如果下载失败,手动下载
docker pull coredns/coredns:1.8.0
docker tag coredns/coredns:1.8.0 registry.cn-hangzhou.aliyuncs.com/google_containers/coredns/coredns:v1.8.0
init 执行完成之后,会输出 子节点 join的token
kubeadm join 192.168.56.111:6443 --token fbqq20.9rh23wne5vkfzh5n --discovery-token-ca-cert-hash sha256:258ad9b91c37f7146c1e0aebab12bd9ff6b15560f1c28beeb09cab80c4706fce
增加配置文件
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
安装 flannel
下载地址:https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
kubectl apply -f kube-flannel.yml
将master设置成工作节点,如果不将master设置成工作节点吗,那必须添加一个工作节点
kubectl taint nodes --all node-role.kubernetes.io/master-
在要加入的node节点上执行init 生成的 join 命令
查看集群的节点
kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master Ready control-plane,master 3h9m v1.21.1
查看pod状态,-A
会查看全部,不加参数只能查看defalut 命名空间,或者使用-n {namespace}
查看指定的命名空间
kubectl get pods -A
安装dashboard
下载地址:
https://raw.githubusercontent.com/kubernetes/dashboard/v2.2.0/aio/deploy/recommended.yaml
修改 dashboard的,使用NodePort的方式让外部能访问 dashboard
kubectl apply -f recomanded.yaml
完成之后,可以查看pod的状态
部署成功之后,通过 kubectl get services -n kube-system
查看所使用的端口(如果未指定)
生成token
创建用户
kubectl create serviceaccount dashboard-admin -n kube-system
kubectl create clusterrolebinding dashboard-cluster-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin
查看生成的token
kubectl describe secret -n kube-system dashboard-admin
安装 istio
下载地址:https://github.com/istio/istio/releases
这里下载最新版的 1.10.0
解压之后,设置环境变量,切换到 解压之后的目录
istioctl install --set profile=demo
安装完成之后,可以查看pod的状态
让指定的命名空间启用 istio
kubectl label namespace default istio-injection=enabled
测试代码
使用 springboot + grpc的方式启动服务
具体的服务定义可以自己定义,服务的
service1:grpc服务
service2:grpc服务,同时依赖service1
client3: http服务,依赖service2
dockerfile 的编写
FROM openjdk:8-jdk-alpine
MAINTAINER why
ADD client3-1.0-SNAPSHOT.jar app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
镜像构建
docker build -t xxx .
如果docker没有设置镜像hub,每个节点都需要构建一次镜像,否则可能因为某些节点找不到镜像
client3的配置:
apiVersion: v1
kind: Service
metadata:
name: grpc-client3
labels:
app: grpc-client3
service: grpc-client3
spec:
type: NodePort
ports:
- name: http
#容器暴露端口
port: 8087
#目标应用端口
targetPort: 8087
selector:
app: grpc-client3
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: grpc-client3-v1
labels:
app: grpc-client3
version: v1
spec:
replicas: 1
selector:
matchLabels:
app: grpc-client3
version: v1
template:
metadata:
labels:
app: grpc-client3
version: v1
spec:
containers:
- name: grpc-client3
image: ms/grpc-client3:latest
imagePullPolicy: IfNotPresent
tty: true
ports:
- name: http
protocol: TCP
containerPort: 8087
service 的配置
apiVersion: v1
kind: Service
metadata:
name: grpc-service1
labels:
app: grpc-service1
service: grpc-service1
spec:
type: ClusterIP
ports:
- name: http
#容器暴露端口
port: 19092
#目标应用端口
targetPort: 9092
#设置gRPC端口
- name: grpc
port: 18888
targetPort: 18888
selector:
app: grpc-service1
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: grpc-service1-v1
labels:
app: grpc-service1
version: v1
spec:
replicas: 1
selector:
matchLabels:
app: grpc-service1
version: v1
template:
metadata:
labels:
app: grpc-service1
version: v1
spec:
containers:
- name: grpc-service1
image: ms/grpc-service1:latest
imagePullPolicy: IfNotPresent
tty: true
ports:
- name: http
protocol: TCP
containerPort: 19092
#指定服务gRPC端口
- name: grpc
protocol: TCP
containerPort: 18888
端口、镜像、label等根据实际情况修改
启动配置文件
spring:
application:
name: grpc-service2
server:
port: 9292
#定义gRPC服务开放的端口
grpc:
server-port: 19999
# 所依赖的grpc服务,如果是本地测试,可以将host改成ip地址
server1-host: grpc-service1
server1-port: 18888
启动三个服务,如果client3的接口能调用成功,表示已经配置完成
日志查看
通过 dashboard 可以查看对应的日志,也可以通过 kubectl logs + pod_name 查看