没有花里胡哨的k8s部署和安装

请输入图片描述

网上很多k8s教程,但是多数都存在漏洞,有些操作的顺序写反了,在部署过程里怎么都不能正常启动,所以此处重新梳理
此处我们假设我们有三台同网段机器
首先,三台机器要同时进行一些前期铺垫

一、基础配置

1、修改主机名

hostnamectl set-hostname master
hostnamectl set-hostname node1
hostnamectl set-hostname node2

2、修改host

cat >> /etc/hosts << EOF
192.168.93.101 master
192.168.93.102 node1
192.168.93.103 node2
EOF

3、关闭防火墙

systemctl stop firewalld && systemctl disable firewalld

4、关闭selinux

#临时
setenforce 0
#永久
vim /etc/selinux/config
SELINUX=disabled

5、关闭交换分区

swapoff -a    # 临时关闭
vim /etc/fstab # 注释到swap那一行  永久关闭

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

cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system  # 生效

7、配置阿里源

cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

8、时间同步(以master为标准做同步)

yum install ntp
vim /etc/ntp.conf
# 在文件中找到 server 行,然后添加一个新的 server 行以指定新的 NTP 服务器的地址,
# 例如:192.168.202.135  这里写自己的master节点ip
systemctl start ntpd && systemctl enable ntpd

# 在两个Node节点 执行手动强制时间同步,以下ip修改为master的ip
ntpdate -u 192.168.202.135

9、配置iptables防火墙

systemctl start iptables
systemctl enable iptables

iptables -I INPUT -s 192.168.52.0/24 -j ACCEPT

iptables -D INPUT -s 192.168.52.0/24 -j ACCEPT
iptables -D OUTPUT -s 192.168.52.0/24 -j ACCEPT

sudo iptables -L

二、Docker配置

wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
yum install wget -y
# k8s1.24版本后不再支持docker,所以这里下载k8s1.23.6适配的Docker版本
yum install docker-ce-19.03.13 -y

cd /etc && mkdir docker
cd docker
vim /etc/docker/daemon.json
{
# 这里镜像源用可用的
"registry-mirrors": [""],
"exec-opts": ["native.cgroupdriver=systemd"]
}

systemctl daemon-reload
systemctl restart docker && systemctl enable docker

三、k8s安装

1、安装环境

yum install -y kubelet-1.23.6 kubeadm-1.23.6 kubectl-1.23.6
systemctl enable kubelet.service
# 验证k8s版本
kubelet --version

2、因为在init过程里,会用到admin.conf文件,以及一些执行文件权限问题,所以要先执行以下操作,很多资料中把这一步放在了后面,总会出现一些问题

mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
source ~/.bash_profile

(注意,上面只是临时加入了环境变量,后边启动后,要手动cp admin.conf到kubelet.kubeconfig)
printenv可以查看环境变量

3、初始化

kubeadm init \
  --apiserver-advertise-address=192.168.52.161 \
  --image-repository registry.aliyuncs.com/google_containers \
  --service-cidr=10.1.0.0/16 \
  --pod-network-cidr=10.244.0.0/16

# 如果出问题,以下可重置
kubeadm reset; rm -rf $HOME/.kube/config

4、node加入

# 上面的命令生成的token
kubeadm join 192.168.127.128:6443 --token gby6wo.wi9mid4m745i58jm \
--discovery-token-ca-cert-hash sha256:983ad455a06036bcb2b6dfb3f33f161cbe0edceeb13fa9c851659d260741e31b

#默认token有效期为24小时,当过期之后,该token就不可用了。这时就需要重新创建token,可以直接使用命令快捷生成
kubeadm token create --print-join-command

四、部署容器网络(master节点执行)

—————————— Calico是一个纯三层的数据中心网络方案,是目前Kubernetes主流的网络方案。

curl https://docs.projectcalico.org/v3.15/manifests/calico.yaml -O
vim calico.yaml
# 修改配置(搜索CALICO_IPV4POOL_CIDR位置,去掉注释,value值修改为k8s初始化时的网段值,
 - name: CALICO_IPV4POOL_CIDR
 value: "10.244.0.0/16"

# 修改完配置后,执行以下命令 
kubectl apply -f calico.yaml

注意!重新init后,一定要再执行一次!

这部分在重新初始化的时候有可能需要执行一下,一般用不到
rm -rf /var/lib/cni/*
rm -rf /var/lib/kubelet/*
rm -rf /etc/cni/*

五、部署完成后,进行一些检验

# 等待4个pod启动,五分钟以内,会陆续启动,并Running状态;
kubectl get pod -A | grep calico
#calico启动后,会自动配置网络,等待片刻,节点状态会自动变为Ready状态。
kubectl top node
kubectl get node
kubectl get pods -A

# master节点测试kubernetes集群
kubectl create deployment nginx --image=nginx
kubectl expose deployment nginx --port=80 --type=NodePort
kubectl get pod,svc

# 检查pod资源日志
kubectl describe pod nginx-554b9c67f9-8v79h
kubectl delete pod nginx-554b9c67f9-8v79h

# 访问http://192.168.56.102:31316/ 测试nginx访问,确认pod部署在哪个node然后用哪个node的IP

六、部署dashboard

如果要设置账户登录,请此时就做好下边关于账户设置的修改

kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.3.1/aio/deploy/recommended.yaml

内容如下:

略...

执行以上内容的yaml

kubectl apply -f dashboard.yaml
# 将 type: ClusterIP 改为 type: NodePort
kubectl edit svc kubernetes-dashboard -n kubernetes-dashboard
# 查询所在端口
kubectl get svc -A |grep kubernetes-dashboard

# 查看所有pod
kubectl get pods --all-namespaces
# 查看所有pod 带pod所在信息
kubectl get pods --all-namespaces -owide
# 查看指定命名空间的pod
kubectl describe pod pod名字 -n pod命名空间
# 查看指定命名空间的pod的详细信息和日志
kubectl describe pod pod名 -n pod命名空间
# 查看指定命名空间的pod的详细信息和日志
kubectl describe pod pod名 --namespace=pod命名空间
kubectl get pods -n kubernetes-dashboard

设置访问端口

将 type: ClusterIP 改为 type: NodePort

kubectl edit svc kubernetes-dashboard -n kubernetes-dashboard

查询端口

kubectl get svc -A |grep kubernetes-dashboard

注意:在多节点的集群中,必须找到运行Dashboard节点的IP来访问,而不是Master节点的IP;可以通过如下命令查询:

kubectl get pod -owide --namespace kubernetes-dashboard

如果仅通过token登录,则

vim dash.yaml 
apiVersion: v1
kind: ServiceAccount
metadata:
  name: admin-user
  namespace: kubernetes-dashboard
---
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: kubernetes-dashboard
#执行语句
kubectl apply -f dash.yaml

#获取访问令牌
kubectl -n kubernetes-dashboard get secret $(kubectl -n kubernetes-dashboard get sa/admin-user -o jsonpath="{.secrets[0].name}") -o go-template="{{.data.token | base64decode}}"
# 或者
kubectl get secret | grep cluster-admin-dashboard-sa
输出:token名   kubernetes.io/service-account-token   3      12m
kubectl describe secrets/cluster-admin-dashboard-sa-token-gl4z4
kubectl describe secrets/token名

手动启动kubernetes API服务器

--advertise-address应该是API服务器的外部IP地址,--etcd-servers是etcd集群的地址

kube-apiserver --kubeconfig=/etc/kubernetes/kubeconfig.yaml --advertise-address=YOUR_API_SERVER_IP --allow-privileged=true --service-cluster-ip-range=10.96.0.0/12 --etcd-servers=http://127.0.0.1:2379 --insecure-port=0 --secure-port=6443

查看etcd集群的地址

cat /etc/kubernetes/manifests/kube-apiserver.yaml

Node 节点重新执行kubeadm join命令

# 编辑 Docker 配置文件
nano /etc/docker/daemon.json
# 重启 Docker
systemctl restart docker
# 删除 kubelet.conf 文件
rm /etc/kubernetes/kubelet.conf
# 删除 ca.crt 文件:
rm /etc/kubernetes/pki/ca.crt
# 重新运行 kubeadm join 命令
kubeadm join 172.23.0.3:6443 --token ri3g1d.0ipesv5s3l30g9dm --discovery-token-ca-cert-hash sha256:f764

账户登录(请不要在生产环境这样做)

建议备份文件

cp /etc/kubernetes/manifests/kube-apiserver.yaml  /etc/kubernetes/manifests/kube-apiserver.yaml-bake-3312
echo "admin,admin,1" > /etc/kubernetes/pki/basic_auth
(此处basic_auth给了可读权限,如果不给权限,不确定会不会出问题)

# 修改apiserver.yaml,如果无法修改,可以通过末尾的命令提取yaml
vim /etc/kubernetes/manifests/kube-apiserver.yaml
# 加入这一行
- --token-auth-file=/etc/kubernetes/pki/basic_auth_file
# 在下面这一堆的后面:
- --requestheader-group-headers=X-Remote-Group
- --requestheader-username-headers=X-Remote-User
- --secure-port=6443
- --service-account-issuer=https://kubernetes.default.svc.cluster.local
- --service-account-key-file=/etc/kubernetes/pki/sa.pub
- --service-account-signing-key-file=/etc/kubernetes/pki/sa.key
- --service-cluster-ip-range=10.1.0.0/16
- --tls-cert-file=/etc/kubernetes/pki/apiserver.crt
- --tls-private-key-file=/etc/kubernetes/pki/apiserver.key

# 在安装dashboard之前,在yaml文件里做出修改
- --token-ttl=21600
- --authentication-mode=basic
# 在下面这一堆的后面:
template:
    metadata:
      labels:
        k8s-app: kubernetes-dashboard
    spec:
      containers:
        - name: kubernetes-dashboard
          image: kubernetesui/dashboard:v2.3.1
          imagePullPolicy: Always
          ports:
            - containerPort: 8443
              protocol: TCP
          args:
            - --auto-generate-certificates
            - --namespace=kubernetes-dashboard

# 设置角色
kubectl create serviceaccount cluster-admin-dashboard-sa

kubectl create clusterrolebinding cluster-admin-dashboard-sa \
  --clusterrole=cluster-admin \
  --serviceaccount=default:cluster-admin-dashboard-sa

# admin绑定权限
kubectl create clusterrolebinding login-on-dashboard-with-cluster-admin --clusterrole=cluster-admin --user=admin
# 查看绑定结果
kubectl get clusterrolebinding login-on-dashboard-with-cluster-admin

一些可能出现的报错

configmaps is forbidden: User  system:anonymous cannot list resource configmaps in API g_wangmiaoyan
# 解决:
kubectl create clusterrolebinding test:anonymous --clusterrole=cluster-admin --user=system:anonymous
 
# 解决:
kubectl create clusterrolebinding gitlab-cluster-admin --clusterrole=cluster-admin --group=system:serviceaccounts --namespace=dev

pod删除
删除这个yaml的pod
kubectl delete -f /etc/kubernetes/manifests/kube-apiserver.yaml

# 查看所有部署
kubectl get deploy -A
# 查看所有容器
kubectl get pod -A
# 查看所有节点
kubectl get node -A
# 可加参数 --all-namespaces


# 把 容器/部署 的yaml提取出来
kubectl get pods/deploy 容器名 -o yaml -n 空间名字 > 88.yaml

# 提取出来之后,可以做一些操作,比如说更新、删除
kubectl apply -f 88.yaml
# apply如果目前没有这个容器或部署,会新建,否则更新

一些命令 !!

# 设置访问端口
$ kubectl proxy --address='0.0.0.0'  --accept-hosts='^*$' --port=端口号

# 获取clusterrolebinding的身份信息
kubectl get clusterrolebinding  login-on-dashboard-with-cluster-admin

# 执行操作后导入到yaml
kubectl create clusterrolebinding login-on-dashboard-with-cluster-admin --clusterrole=cluster-admin --user=admin >dashboard-with-cluster-admin.yaml

# 查看role参数
kubectl explain role
kubectl explain rolebinding
kubectl describe sa cluster-admin

# 判断某clusterrolebinding是否有权限
kubectl auth can-i get pods --as=system:serviceaccount:default:cluster-admin-dashboard-sa

# 获取所有clusterrolebinding
kubectl get clusterroles.rbac.authorization.k8s.io --all-namespaces
# 获取所有role
kubectl get roles.rbac.authorization.k8s.io --all-namespaces

# 获取clusterrolebinding信息到yaml
kubectl get user clusterrolebinding名字 -o yaml -n default > 8812.yaml

# 删除clusterrolebinding
kubectl delete clusterrolebinding clusterrolebinding名字

kubectl get clusterrolebinding -n 工作空间名

kubectl delete clusterrolebinding clusterrolebinding名字

扫描二维码,在手机上阅读!

发表评论

电子邮件地址不会被公开。 必填项已用*标注