k8s集群搭建

安装 k8s 集群

virtualbox + centos7 64位

网路设置:启用网络设置,配置 NAT (虚拟机访问外网)和 host-only(宿主机访问虚拟机) 网络

安装yum工具

yum -y install yum-utils

关闭防火墙、selinuxswap

# 关闭防火墙
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-cidrpod-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 查看

TAG:k8s