kubernetes部署

目录

      • kubeadm部署
        • 环境初始化
        • 环境准备
          • 安装Docker/kubeadm/kubelet【所有节点】
          • 部署kubernetes
          • 部署网络组件(CNI)
          • k8s集群中IP变化后如何恢复集群
          • calico组件异常
          • 测试
          • 部署dashboard
      • kubernetes命令使用
        • 配置k8s命令补全
        • 查看集群状态
      • k8s替换CRI(容器运行时)
      • 二进制包部署

kubeadm部署

环境初始化

# 关闭防火墙
systemctl stop firewalld
systemctl disable firewalld

# 关闭selinux
sed -i 's/enforcing/disabled/' /etc/selinux/config  # 永久,重启后生效
setenforce 0  # 临时

# 关闭swap
swapoff -a  # 临时
sed -ri 's/.*swap.*/#&/' /etc/fstab    # 永久

# 根据规划设置主机名(三台主机)
hostnamectl set-hostname <hostname>

# 在master添加hosts
cat >> /etc/hosts << EOF
192.168.1.47 k8s-master1
192.168.1.48 k8s-node1
192.168.1.52 k8s-node2
EOF

# 将桥接的IPv4流量传递到iptables的链
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
# 加入这个是为了防止在node节点加入集群中报相关错误
# (错误如下--"[ERROR FileContent--proc-sys-net-ipv4-ip_forward]: /proc/sys/net/ipv4/ip_forward contents are not set to 1")
net.ipv4.ip_forward = 1
EOF
sysctl --system  # 生效

# 时间同步
yum install ntpdate -y
ntpdate time.windows.com

环境准备

安装Docker/kubeadm/kubelet【所有节点】

这里使用Docker作为容器引擎,也可以换成别的,例如containerd

# 三台机器都要操作
# 安装Docker
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
yum -y install docker-ce
systemctl enable docker && systemctl start docker
# 配置镜像下载加速器
cat > /etc/docker/daemon.json << EOF
{
  "registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"]
}
EOF

systemctl restart docker
docker info
# 添加阿里云YUM软件源
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

# 安装kubeadm,kubelet和kubectl(kubectl一般在master节点装就可以的)
yum install -y kubelet-1.21.0 kubeadm-1.21.0 kubectl-1.21.0
systemctl enable kubelet
部署kubernetes

在master上执行

kubeadm init \
  --apiserver-advertise-address=192.168.1.47 \
  --image-repository registry.aliyuncs.com/google_containers \
  --kubernetes-version v1.21.0 \
  --service-cidr=10.96.0.0/12 \
  --pod-network-cidr=10.244.0.0/16 \
  --ignore-preflight-errors=all

或者编辑一个conf文件

vi kubeadm.conf
apiVersion: kubeadm.k8s.io/v1beta2
kind: ClusterConfiguration
kubernetesVersion: v1.21.0
imageRepository: registry.aliyuncs.com/google_containers 
networking:
  podSubnet: 10.244.0.0/16 
  serviceSubnet: 10.96.0.0/12 
# 配置好后直接应用即可
kubeadm init --config kubeadm.conf --ignore-preflight-errors=all 

参数 含义
–apiserver-advertise-address 集群通告地址
–image-repository 由于默认拉取镜像地址k8s.gcr.io国内无法访问,这里指定阿里云镜像仓库地址
–kubernetes-version K8s版本,与上面安装的一致
–service-cidr 集群内部虚拟网络,Pod统一访问入口
–pod-network-cidr Pod网络,与下面部署的CNI网络组件yaml中保持一致

kubernetes部署_第1张图片
kubernetes部署_第2张图片
将node节点分别执行命令
kubernetes部署_第3张图片
在master上可以看到节点信息,之所以为NotReady,是因为网络组件还没有装好
kubernetes部署_第4张图片

部署网络组件(CNI)

之后的所有yaml文件都在master上执行即可

# 在master上执行即可
wget https://docs.projectcalico.org/manifests/calico.yaml --no-check-certificate
# 下载完后还需要修改里面定义Pod网络(CALICO_IPV4POOL_CIDR),与前面kubeadm init的 --pod-network-cidr指定的一样。
[root@k8s-master1 ~]# vim calico.yaml
            - name: CALICO_IPV4POOL_CIDR
              # 网段改成和之前设置一样的
              value: "10.244.0.0/16"
# 改完之后部署         
kubectl apply -f calico.yaml
kubectl get pods -n kube-system

拉去镜像中,等待即可
kubernetes部署_第5张图片
经过漫长的等待,看到calico组件都Running了,但是croedns组件拉去镜像失败,那就需要手动拉下了
kubernetes部署_第6张图片
先使用命令查看日志"kubectl describe pods coredns-545d6fc579-48nzz -n kube-system"
得到如下结果
kubernetes部署_第7张图片

# 手动拉取镜像(三个节点都需要执行)
docker pull registry.aliyuncs.com/google_containers/coredns:1.8.0
# 因为tag名不一样需要修改tag
docker tag registry.aliyuncs.com/google_containers/coredns:1.8.0 registry.aliyuncs.com/google_containers/coredns/coredns:v1.8.0

这样子就ok啦
kubernetes部署_第8张图片
遇到的其他报错(这个是我在重启之后报的错误)
kubernetes部署_第9张图片
过会儿之后他有变成了CrashLoopBackOff状态,他会一直重启
kubernetes部署_第10张图片
上日志
kubernetes部署_第11张图片
解决:
查看该pod是在那个节点运行(k8s-node1节点),并查看该节点的对应容器的状态(可以看出这个容器是退出状态)
kubernetes部署_第12张图片
kubernetes部署_第13张图片
停掉node1节点的kubelet,不然删掉他就会自己拉起来
在这里插入图片描述
然后停容器+删容器kubernetes部署_第14张图片
kubernetes部署_第15张图片
重启kubelet,让他自己去重构pod
在这里插入图片描述
master查看状态,好啦
kubernetes部署_第16张图片

k8s集群中IP变化后如何恢复集群
# 各个节点执行以下命令(所有节点都需要执行)
kubeadm reset
# 然后master节点重新执行init命令,node节点重新执行join命令

参考链接

calico组件异常

今天在查看组件状态时发现calico有一个没有ready
kubernetes部署_第17张图片
这是因为没有发现真正的网卡,所以就修改calico的配置文件
kubernetes部署_第18张图片

# 修改如下内容
[root@k8s-master mysql]# kubectl edit daemonset calico-node -n kube-system

找到对应的位置
kubernetes部署_第19张图片

- name: IP_AUTODETECTION_METHOD
  value: "interface=ens*"

修改结果为下,修改玩之后等待一段时间即可
kubernetes部署_第20张图片

测试
# 在Kubernetes集群中创建一个nginx的pod,验证是否正常运行
kubectl create deployment nginx --image=nginx
kubectl expose deployment nginx --port=80 --type=NodePort
kubectl get pod,svc

kubernetes部署_第21张图片

访问node1的IP和端口
kubernetes部署_第22张图片

部署dashboard
wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.3/aio/deploy/recommended.yaml
# 默认Dashboard只能集群内部访问,修改Service为NodePort类型,暴露到外部
vi recommended.yaml
...
kind: Service
apiVersion: v1
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard
  namespace: kubernetes-dashboard
spec:
  ports:
    - port: 443
      targetPort: 8443
      nodePort: 30001
  selector:
    k8s-app: kubernetes-dashboard
  type: NodePort
...
# 部署
kubectl apply -f recommended.yaml
kubectl get pods -n kubernetes-dashboard

查看pod正常后,访问即可
kubernetes部署_第23张图片
kubernetes部署_第24张图片
kubernetes部署_第25张图片

# 创建token
# 创建用户
kubectl create serviceaccount dashboard-admin -n kube-system
# 用户授权
kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin
# 获取用户Token
kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}')
# 将输出的结构复制到dashboard即可

k8s遇到的一些小问题

在get cs时,会发现连接拒绝,还有一个警告
在这里插入图片描述
这个不影响使用的,但是也可以解决,

# 修改一下两个配置文件,--port=0都注释掉
# 这两个文件是这两个组件的配置文件,默认不启用的
[root@k8s-master1 ~]# vim /etc/kubernetes/manifests/kube-controller-manager.yaml
[root@k8s-master1 ~]# vim /etc/kubernetes/manifests/kube-scheduler.yaml

kubernetes部署_第26张图片
稍微等一会儿就会恢复正常
kubernetes部署_第27张图片

kubernetes命令使用

配置k8s命令补全

[root@k8s-master1 ~]# yum -y install bash-completion.noarch
[root@k8s-master1 ~]# source <(kubectl completion bash)
# 这样即可补全命令

查看集群状态

查看master组件状态

[root@k8s-master1 ~]# kubectl get cs
# cs全拼componentstatuses,可以使用kubectl api-resources查看,别名和全拼

查看node状态

kubectl get node

查看资源的详情

# 如果没有所在名称空间不写即可
kubectl describe <资源类型> <资源名称> -n <资源所在的名称空间>

查看资源信息

#wide显示详情,yaml以yaml格式输出
kubectl get <资源类型> <资源名称> -o wide/yaml
# 使用这条命令查看
[root@k8s-master1 ~]# kubectl api-resources
# 查看结果
NAME                              SHORTNAMES   APIVERSION                             NAMESPACED   KIND
bindings                                       v1                                     true         Binding
componentstatuses                 cs           v1                                     false        ComponentStatus
configmaps                        cm           v1                                     true         ConfigMap
endpoints                         ep           v1                                     true         Endpoints

k8s替换CRI(容器运行时)

k8s中目前提供的CRI是docker shim,当然也是兼容其他容器运行时的
将docker替换为其他的容器运行时,这里使用Containerd

# 查看是否加载overlay模块(默认是加载的)
[root@k8s-master1 ~]# lsmod | grep overlay
overlay                71964  12 
[root@k8s-master1 ~]# lsmod | grep br_netfil
br_netfilter           22256  0 
bridge                151336  1 br_netfilter

# 为了防止出错,还是先配置以下较好
cat <<EOF | sudo tee /etc/modules-load.d/containerd.conf
overlay
br_netfilter
EOF

modprobe overlay
modprobe br_netfilter

# 设置必需的 sysctl 参数,这些参数在重新启动后仍然存在。
cat <<EOF | sudo tee /etc/sysctl.d/kubernetes-cri.conf
net.bridge.bridge-nf-call-iptables  = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward                 = 1
EOF

sysctl --system

# 安装containerd
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo
yum install -y containerd.io
mkdir -p /etc/containerd
# 自己生产一个配置文件(他是有自己的配置文件的,但是自己的配置文件参数太少了,需要手动生成一个)
containerd config default > /etc/containerd/config.toml

其实在装docker的时候已经装好了contained,因为docker里面就包含的contained
kubernetes部署_第28张图片

# 修改配置文件
vim /etc/containerd/config.toml
# 找到以下内容并修改成和我一样的设置
      # pause镜像设置过阿里云镜像仓库地址
      sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.2"  
         ...
         # 在这个选项之下添加SystemdCgroup
         # cgroups驱动设置为systemd
         [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
             SystemdCgroup = true
             ...
        # 拉取Docker Hub镜像配置加速地址设置为阿里云镜像仓库地址 
        [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
          endpoint = ["https://b9pmyelo.mirror.aliyuncs.com"]
# 重启containerd          
systemctl restart containerd
# 配置kubelet使用containerd
vim /etc/sysconfig/kubelet 
KUBELET_EXTRA_ARGS=--container-runtime=remote --container-runtime-endpoint=unix:///run/containerd/containerd.sock --cgroup-driver=systemd
# 重启kubelet
systemctl restart kubelet

在master上查看节点使用的CRI,发现node2已经变为了containerd了
这里说下containerd我个人感觉还不是很成熟,而且现在企业中常用的kubernets版本都在1.20以下,而k8s官网说1.23才会弃用,所以这个当作了解即可
像把他换回去也简单,修改/etc/sysconfig/kubelet将刚刚加入的配置去掉后重启即可
在这里插入图片描述

二进制包部署

你可能感兴趣的:(kubernetes,kubernetes)