k8s 简单集群搭建(1213)

注意:本人使用centos7系统进行搭建

一、基本环境准备

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
bash复制代码#禁用**iptables**和**firewalld**服务

#关闭firewalld服务
systemctl stop firewalld
systemctl disable firewalld
#关闭iptables服务
systemctl stop iptables
systemctl disable iptables

# 关闭 swap
swapoff -a && sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab

#禁用**selinux**
sed -i 's/enforcing/disabled/' /etc/selinux/config

# 将桥接的IPv4流量传递到iptables的链

vim /etc/sysctl.d/k8s.conf
#增加如下内容
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1

# 生效命令
sysctl --system

二、docker环境准备

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
bash复制代码wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
yum list docker-ce --showduplicates | sort -r
#安装指定版本
yum install docker-ce-20.10.7

# 添加阿里云 yum 源, 可从阿里云容器镜像管理中复制镜像加速地址
cat <<EOF > /etc/docker/daemon.json
{
"registry-mirrors": [
"https://registry.docker-cn.com",
"http://hub-mirror.c.163.com",
"https://docker.mirrors.ustc.edu.cn"
]
}
EOF

#启动docker
systemctl enable docker && systemctl start docker

三、安装 kubeadm、kubelet 和 kubectl

1
2
3
4
5
6
7
8
9
10
11
12
ini复制代码cat > /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

yum install -y kubelet-1.21.3 kubeadm-1.21.3 kubectl-1.21.3
systemctl enable kubelet

四、单机部署

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
bash复制代码# 设置hostname
hostnamectl set-hostname master
cat >> /etc/hosts << EOF
192.168.137.200 master
EOF

# 初始化 Master
kubeadm init \
--apiserver-advertise-address=192.168.137.200 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.21.3 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16

#可能遇到coredns镜像下载失败 用下面方式解决
docker pull registry.aliyuncs.com/google_containers/coredns:1.8.0
docker tag registry.aliyuncs.com/google_containers/coredns:1.8.0 registry.aliyuncs.com/google_containers/coredns:v1.8.0
docker rmi registry.aliyuncs.com/google_containers/coredns:1.8.0

# 为其他非root用户创建执行权限
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

#root 用户,则可以运行:
export KUBECONFIG=/etc/kubernetes/admin.conf

# 去除污点
kubectl describe node master | grep Taints
kubectl taint nodes master node-role.kubernetes.io/master-

# 部署CNI网络插件
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
# 查看运行状态
kubectl get pods -n kube-system

image.png

五、集群部署

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
bash复制代码设置 hosts

# 设置主机名
hostnamectl set-hostname master # node1 / node2
hostname

# 配置 hosts(只在master执行)
cat >> /etc/hosts << EOF
192.168.137.200 master
192.168.137.201 node1
192.168.137.202 node2
EOF
#初始化 Master

kubeadm init \
--apiserver-advertise-address=192.168.137.200 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.21.3 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

#root 用户,则可以运行:
export KUBECONFIG=/etc/kubernetes/admin.conf

kubectl get nodes
#初始化 Node

kubeadm join 192.168.137.200:6443 --token 0bgtnj.6xl01261s02wqc7z \
--discovery-token-ca-cert-hash sha256:6553e9758f5eb18d81e793e936fffb7a168c943a6429de0834e1946033ce6f80
#可能出现的错误
[ERROR FileContent--proc-sys-net-ipv4-ip_forward]: /proc/sys/net/ipv4/ip_forward contents are not set to 1

kubeadm reset
echo 1 > /proc/sys/net/ipv4/ip_forward
#部署 CNI 网络插件(Master)

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
# 查看运行状态
kubectl get pods -n kube-system

ipvs配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
bash复制代码# 安装ipvs
yum -y install ipvsadm ipset

# 永久生效
cat > /etc/sysconfig/modules/ipvs.modules <<EOF
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
EOF

# 为脚本文件添加执行权限
chmod +x /etc/sysconfig/modules/ipvs.modules
# 执行脚本文件
/bin/bash /etc/sysconfig/modules/ipvs.modules
# 查看对应的模块是否加载成功
lsmod | grep -e ip_vs -e nf_conntrack_ipv4

#修改kube-proxy配置 如下图
kubectl edit configmap kube-proxy -n kube-system

image.png

删除原有的 kube-proxy

image.png

1
2
3
4
5
6
7
perl复制代码#查看pod
kubectl get pod -n kube-system
#删除pod
kubectl delete pod kube-proxy-* -n kube-system
#查看新pod
kubectl get pod -n kube-system
#查看日志看是否有ipvs

image.png

dashboard UI监控使用

github地址 github.com/kubernetes/…

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
yaml复制代码#下载
wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.3.1/aio/deploy/recommended.yaml

#编辑文件开放端口进行访问
kind: Service
apiVersion: v1
metadata:
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard
namespace: kubernetes-dashboard
spec:
type: NodePort
ports:
- port: 443
targetPort: 8443
nodePort: 31443
selector:
k8s-app: kubernetes-dashboard

#设置超级用户 roleRef 按照如下修改
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: kubernetes-dashboard-minimal
namespace: kube-system
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: kubernetes-dashboard
namespace: kube-system

---

#启动
kubectl apply -f recommended.yaml

#获取token

kubectl -n kubernetes-dashboard describe secret $(kubectl -n kubernetes-dashboard get secret | grep admin-user | awk '{print $1}')

#会显示token字符串然后进行登陆

image.png

简单springboot应用部署

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
yaml复制代码vim k8s-springboot.yaml

apiVersion: v1
kind: Namespace
metadata:
name: k8s-springboot
---
apiVersion: v1
kind: Service
metadata:
name: springboot-demo-nodeport
namespace: k8s-springboot
spec:
type: NodePort
ports:
- port: 8080
targetPort: 8080
nodePort: 30001
selector:
app: springboot-demo
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: springboot-demo
namespace: k8s-springboot
spec:
selector:
matchLabels:
app: springboot-demo
replicas: 1
template:
metadata:
labels:
app: springboot-demo
spec:
containers:
- name: springboot-demo
image: huzhihui/springboot:1.0.0
ports:
- containerPort: 8080

# 部署
kubectl apply -f k8s-springboot.yaml

#查看部署pod状态
kubectl get pods --all-namespaces

image.png

image.png

使用proxy访问服务

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
ini复制代码#使用kubectl proxy命令就可以使API server监听在本地的8001端口上:
$ kubectl proxy
Starting to serve on 127.0.0.1:8001

#如果想通过其它主机访问就需要指定监听的地址:
$ kubectl proxy --port=8009
Starting to serve on 127.0.0.1:8009

$ kubectl proxy --port=8009
Starting to serve on 127.0.0.1:8009

#此时通过curl访问会出现未认证的提示:
$ curl -X GET -L http://master:8009/
<h3>Unauthorized</h3>

#设置API server接收所有主机的请求:
$ kubectl proxy --address='0.0.0.0' --accept-hosts='^*$' --port=8009
Starting to serve on [::]:8009

#访问正常:
$ curl -X GET -L http://k8s-master:8009/
{
"paths": [
"/api",
"/api/v1",
...
]
}
#访问方式:
curl http://[k8s-master]:8009/api/v1/namespaces/[namespace-name]/services/[service-name]/proxy

#若要服务一直后台运行则用
nohup kubectl proxy --address='0.0.0.0' --accept-hosts='^*$' --port=8009 2>&1 &

ingress使用

插件地址 kubernetes.github.io/ingress-ngi…

1
2
3
4
bash复制代码#安装插件
wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v0.48.1/deploy/static/provider/cloud/deploy.yaml
#编辑文件修改如下版本,因为镜像在国内拉取不到,所以换了一下
vim deploy.yaml

image.png

运行 kubectl apply -f deploy.yaml 只要下面的controller成功了就可以了,另外两个先不用管

image.png

编写自己的ingress,之前我已经创建了springboot-demo-nodeportservice了,所以我直接使用
k8s-springboot-ingress.yaml文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
yaml复制代码apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: k8s-springboot-ingress
namespace: k8s-springboot
spec:
rules:
- host: k8s-springboot.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: springboot-demo-nodeport
port:
number: 8080

查看ingress 命令为: kubectl get ingress --all-namespaces

image.png

编辑hosts文件

1
2
3
bash复制代码vim /etc/hosts
#增加下面这行 自己主机的IP
192.168.137.200 k8s-springboot.com

访问 curl http://k8s-springboot.com

image.png

至此简单的使用就完了,我也刚刚学习,还有很多不懂,还希望大佬们指教

本文转载自: 掘金

开发者博客 – 和开发相关的 这里全都有

0%