Admin
2020-10-25:
搭建 Kubernetes(一) 跟着官方文档从零搭建K8S
搭建的踩坑文档 干货!Kubernates集群搭建及初始化spring cloud环境中遇到的坑
Dashboard参考 部署k8s,安装kubernetes-dashboard Web UI
修改主机名 k8s-master
、 k8s-node1
…
hostnamectl set-hostname k8s-master
然后编辑文件 /etc/hosts
,新增主机名和IP地址关系:
192.168.1.114 k8s-master
192.168.1.115 k8s-node1
关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
编辑文件 /etc/selinux/config
,修改为 SELINUX=disabled
,重启生效
编辑文件 /etc/fstab
,注释 swap
行,重启生效
安装并启用 docker
:
yum install -y docker
systemctl enable docker
systemctl start docker
新建文件 /etc/yum.repos.d/kubernetes.repo
:
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
exclude=kube*
yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
systemctl enable kubelet && systemctl start kubelet
确保文件 /etc/sysctl.d/k8s.conf
内容:
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
生效:
sysctl --system
生成配置文件:
kubeadm config print init-defaults > kubeadm-init.yaml
advertiseAddress
值为本机网卡IPimageRepository
值为 imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers
使用配置文件,初始化:
kubeadm config images pull --config kubeadm-init.yaml
kubeadm init --config kubeadm-init.yaml
成功输出的最后两行,记得 保存
:
Your Kubernetes control-plane has initialized successfully!
To start using your cluster, you need to run the following as a regular user:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
https://kubernetes.io/docs/concepts/cluster-administration/addons/
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join 192.168.1.114:6443 --token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:c5ad42d6716552b2cb7d07bb776305fa124b86024d4ab5c1b92bf134ee7cbb9e
允许 root
用户执行 kubectl
:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
下载配置文件:
wget https://docs.projectcalico.org/v3.8/manifests/calico.yaml
踩坑文里建议不要改直接用,的确建立完成集群没什么问题,过了一个星期服务器重启后发现以下现象:
curl cip.cc
服务名
访问集群内部署的其他服务,例如: curl nginx-8082:8082
,nginx-8082
是一个nginx服务,对集群内暴露端口 8082
NodePort
方式对外暴露的服务,只能通过真实节点IP端口访问,无法通过集群内其他节点IP端口访问参考 k8s master节点nodePort方式不能访问服务,编辑文件 calico.yaml
:
修改 CALICO_IPV4POOL_CIDR
的值与文件 kubeadm-init.yaml
内 serviceSubnet
的值一致:
省略
- name: CALICO_IPV4POOL_CIDR
value: "10.96.0.0/12"
省略
在 # Auto-detect the BGP IP address.
前加入 IP_AUTODETECTION_METHOD
:
省略
# Specify interface
- name: IP_AUTODETECTION_METHOD
value: "interface=enp.*"
# Auto-detect the BGP IP address.
- name: IP
value: "autodetect"
省略
enp.*
是宿主机网卡名称前缀,命令 ifconfig
查询应用生效:
kubectl apply -f calico.yaml
稍等几分钟,查看节点状态,直到 Ready
:
[root@k8s-master k8s]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master Ready master 106m v1.19.3
一般情况下, master
节点都不提供部署能力,所以单节点情况下需要让 master
节点同时作为 node
,否则后续部署应用时会提示 0/1 nodes are available: 1 node(s) had taints that the pod didn't tolerate
:
kubectl taint nodes --all node-role.kubernetes.io/master-
做完 准备 和 #安装Kubernetes 全部步骤
加入集群,使用 master
初始化的凭证:
kubeadm join 192.168.1.114:6443 --token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:c5ad42d6716552b2cb7d07bb776305fa124b86024d4ab5c1b92bf134ee7cbb9e
如果凭证超过有效期(24小时),参考 kubernetes join 卡住 token过期 需要到 master
节点手动生成
生成永久凭证:
kubeadm token create --ttl 0
查询:
kubeadm token list
openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
TOKEN
列,对应加入集群命令参数 token
discovery-token-ca-cert-hash
,一般不会变替换参数后重新加入集群,到 master
节点,等待几分钟,直到 Ready
:
[root@k8s-master k8s]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master Ready master 2d4h v1.19.3
k8s-node1 Ready <none> 118s v1.19.3
Dashboard不是必须的,但是有它可以省很多事:
node/service/pod
等状态一目了然下载文件:
wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0/aio/deploy/recommended.yaml
编辑文件 recommended.yaml
修改超时时间(默认900秒),在 - --namespace=kubernetes-dashboard
后添加行 - --token-ttl=86400
:
省略
args:
- --auto-generate-certificates
- --namespace=kubernetes-dashboard
- --token-ttl=86400
省略
暴露服务,改为 NodePort
方式,在 targetPort: 8443
后添加两行 nodePort: 30002
和 type: NodePort
:
省略
spec:
ports:
- port: 443
targetPort: 8443
nodePort: 30002
type: NodePort
省略
应用生效:
kubectl apply -f recommended.yaml
然后,访问 https://master节点ip:30002
即可,暂时还无法登录
thisisunsafe
即可跳过用户
然后生成 Token
的方式新建文件 dashboard-adminuser.yaml
:
apiVersion: v1
kind: ServiceAccount
metadata:
name: admin-user
namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: admin-user
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: admin-user
namespace: kube-system
应用生效:
kubectl apply -f dashboard-adminuser.yaml
获取 token
:
kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep admin-user | awk '{print $1}')
生成的 token
可以保存到文件,打开 dashboard
网页,输入 token
,即可登录:
暂时没发现什么用途,跳过吧
需要访问 dashboard
网页的电脑,拷贝证书文件 kubecfg.p12
后,手动导入证书:
打开Chrome - 设置 - 隐私设置和安全性 - 安全 - 管理证书 - 导入 - 选择证书文件 - 输入证书密码
然后访问,就会弹窗提示有可用证书
证书可以用来远程访问集群
kubectl
使用证书访问控制集群因为初始化集群,已经将服务器的 kubectl
自动配置到集群 api server
了,所以使用服务器 kubectl
配置生成证书相关文件:
grep 'certificate-authority-data' ~/.kube/config | head -n 1 | awk '{print $2}' | base64 -d >> kubecfg.ca
grep 'client-certificate-data' ~/.kube/config | head -n 1 | awk '{print $2}' | base64 -d >> kubecfg.crt
grep 'client-key-data' ~/.kube/config | head -n 1 | awk '{print $2}' | base64 -d >> kubecfg.key
openssl pkcs12 -export -clcerts -inkey kubecfg.key -in kubecfg.crt -out kubecfg.p12 -name "kubernetes-client"
保存
密码
,请 记住
客户端访问远程集群,需要下载和服务器相同版本的 kubectl
curl -LO https://storage.googleapis.com/kubernetes-release/release/v1.19.3/bin/linux/amd64/kubectl
chmod +x kubectl
sudo mv kubectl /usr/bin/
参考 kubectl 通过配置文件添加上下文访问远程集群 配置集群证书
https://192.168.1.114:6443
/home/wood/kubrenetes/114/
114
,以后可以使用这个名字切换已配置的不同的集群 kubectl config use-context 114
kubectl config set-cluster only-k8s --server https://192.168.1.114:6443 --certificate-authority=/home/wood/kubrenetes/114/kubecfg.ca
kubectl config set-credentials kubernetes-admin --client-certificate=/home/wood/kubrenetes/114/kubecfg.crt --client-key=/home/wood/kubrenetes/114/kubecfg.key
kubectl config set-context 114 --cluster=only-k8s --namespace=default --user=kubernetes-admin
kubectl config use-context 114
然后测试,能否访问集群:
kubectl version
kubectl get nodes