k8s-1.24.4详细安装教程(附镜像)

  • 废话不多说,直接介绍怎么安装(这里是安装的CICD环境,后续会一步一步实现gitlab+docker+harbor+k8s+jenkins,不需要的软件,可以直接忽略。)

环境配置

Hostname IP 备注 (为节省虚拟机,安装的其他软件,只装k8s可不安装)
master 192.168.47.100 jenkins(至少3G内存)
node1 192.168.47.101 harbor
node2 192.168.47.102 gitlab(至少4G内存)
  • 需要注意版本之间的依赖关系
软件 版本 备注
操作系统 CentOS7 /
内核 5.19.8 如果内核为3.10,建议先升级(master初始化可能会报错)
JDK 1.8,11 https://www.oracle.com/java/technologies/javase-downloads.html
Maven 3.0.5 https://maven.apache.org/
docker 20.10.17 https://www.docker.com/
Kubernetes 1.24.4 https://kubernetes.io/
cri-docker 0.2.3
Gitlab 15.4 https://about.gitlab.com/
Jenkins 2.361.1-1.1 依赖jdk11
Harbor v2.6.0 https://goharbor.io/
  • 查看以及升级内核的方法
查看内核版本
[root@k8s cgroup]# uname -r
3.10.0-327.el7.x86_64

导入EL repo库
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm

[root@k8s cgroup]# yum --disablerepo="*" --enablerepo="elrepo-kernel" list available
可安装的软件包
elrepo-release.noarch          
kernel-lt.x86_64   
kernel-lt-devel.x86_64 
kernel-lt-doc.noarch 
kernel-lt-headers.x86_64 
kernel-lt-tools.x86_64  
kernel-lt-tools-libs.x86_64   
kernel-lt-tools-libs-devel.x86_64   
kernel-ml.x86_64       
kernel-ml-devel.x86_64       
kernel-ml-doc.noarch     
kernel-ml-headers.x86_64      
kernel-ml-tools.x86_64        
kernel-ml-tools-libs.x86_64          
kernel-ml-tools-libs-devel.x86_64      
perf.x86_64                            
python-perf.x86_64      

安装稳定内核
yum --enablerepo=elrepo-kernel install kernel-ml

修改GRUB选项,使新安装的内核作为优先启动
cp /etc/default/grub  /etc/default/grub_bak
[root@k8s cgroup]# vim /etc/default/grub
[root@k8s cgroup]# cat /etc/default/grub
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
# GRUB_DEFAULT=saved-->GRUB_DEFAULT=0
GRUB_DEFAULT=0
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet"
GRUB_DISABLE_RECOVERY="true"

重新创建内核配置
[root@k8s cgroup]# grub2-mkconfig -o /boot/grub2/grub.cfg
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-5.19.8-1.el7.elrepo.x86_64
Found initrd image: /boot/initramfs-5.19.8-1.el7.elrepo.x86_64.img
Found linux image: /boot/vmlinuz-3.10.0-327.el7.x86_64
Found initrd image: /boot/initramfs-3.10.0-327.el7.x86_64.img
Found linux image: /boot/vmlinuz-0-rescue-575e24cf52124364b060acab9088f9b8
Found initrd image: /boot/initramfs-0-rescue-575e24cf52124364b060acab9088f9b8.img
done

重启验证
reboot
uname -r
5.19.8-1.el7.elrepo.x86_64
  • 环境配置
#!/bin/bash

# 彻底清除原先安装的k8s环境
kubeadm reset -f
modprobe -r ipip
rm -rf ~/.kube/
rm -rf /etc/kubernetes/
rm -rf /etc/systemd/system/kubelet.service.d
rm -rf /etc/systemd/system/kubelet.service
rm -rf /usr/bin/kube*
rm -rf /etc/cni
rm -rf /opt/cni
rm -rf /var/lib/etcd
rm -rf /var/etcd
yum clean all
yum remove kube* -y

# 关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
firewall-cmd --state

# 关闭selinux
setenforce 0
sed -i "s/SELINUX=.*/SELINUX=disabled/g" /etc/selinux/config 

# 关闭swap
# 临时关闭
swapoff -a
# 永久关闭,这个需要重启生效
sed -i 's/\/dev\/mapper\/centos-swap/#\/dev\/mapper\/centos-swap/g' /etc/fstab


# 允许桥接
cat > /etc/modules-load.d/k8s.conf <cat > /etc/sysctl.d/k8s.conf <.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
sudo sysctl --system

# hosts文件 域名通信
echo 192.168.47.100 k8s-master >> /etc/hosts
echo 192.168.47.101 k8s-node >> /etc/hosts
echo 192.168.47.102 k8s-node2 >> /etc/hosts

# 配置阿里源
cd /etc/yum.repos.d/
mkdir bak
mv * bak
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
yum clean all
yum makecache

# 安装docker
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
mkdir /etc/docker
cat > /etc/docker/daemon.json <{
"registry-mirrors": ["https://hzfyo6gg.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=systemd"]
}
EOF
yum install -y yum-utils device-mapper-persistent-data lvm2
yum install -y docker-ce
systemctl enable docker
systemctl daemon-reload
systemctl restart docker

# 安装k8s-1.24.4
cat < /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=0
EOF
yum install kubeadm-1.24.4 kubelet-1.24.4 -y
systemctl enable kubelet

  • 安装jdk和maven(用于cicd流程,可选)
yum install -y java-openjdk
yum install -y maven
mkdir /home/repository
vim /etc/maven/settings.xml 
"http://maven.apache.org/SETTINGS/1.0.0" 
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
          xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
  # 加上
  /home/repository</localRepository>

  # 修改
  
    
      aliyunmaven</id>
      *</mirrorOf>
      阿里云公共仓库</name
     https://maven.aliyun.com/repository/public</url>
    </mirror>
  </mirrors>

k8s集群搭建

安装和配置cri-docker

  • 软件包–>百度网盘
  • 链接:https://pan.baidu.com/s/1DztUfYpEZdkzic7lg1yF1g
    提取码:raq6
tar -xf cri-dockerd-0.2.3.amd64.tgz 
cp cri-dockerd/cri-dockerd /usr/local/
  • 创建cri-docker启动文件
    https://github.com/Mirantis/cri-dockerd/tree/master/packaging/systemd/cri-docker.service

    https://github.com/Mirantis/cri-dockerd/blob/master/packaging/systemd/cri-docker.socket

[root@k8s ~]# vim /usr/lib/systemd/system/cri-docker.service
[Unit]
Description=CRI Interface for Docker Application Container Engine
Documentation=https://docs.mirantis.com
After=network-online.target firewalld.service docker.service
Wants=network-online.target
Requires=cri-docker.socket

[Service]
Type=notify
# 指定pause:3.7
ExecStart=/usr/local/cri-dockerd --network-plugin=cni --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.7
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutSec=0
RestartSec=2
Restart=always

StartLimitBurst=3

StartLimitInterval=60s

LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity

TasksMax=infinity
Delegate=yes
KillMode=process

[Install]
WantedBy=multi-user.target

[root@k8s ~]# vim /usr/lib/systemd/system/cri-docker.socket
[Unit]
Description=CRI Docker Socket for the API
PartOf=cri-docker.service

[Socket]
ListenStream=%t/cri-dockerd.sock
SocketMode=0660
SocketUser=root
SocketGroup=docker

[Install]
WantedBy=sockets.target

  • 启动cri-docker并设置开机自动启动
systemctl daemon-reload
systemctl restart cri-docker.service 
systemctl enable cri-docker.service 

初始化master

  • 必须指定–cri-socket unix://var/run/cri-dockerd.sock(),除了kubeadm init命令外,kubeadm reset,kubeadm join都要指定
kubeadm init --image-repository registry.aliyuncs.com/google_containers --cri-socket unix://var/run/cri-dockerd.sock --ignore-preflight-errors=NumCPU --service-cidr=10.10.0.0/16 --pod-network-cidr=10.122.0.0/16 --kubernetes-version=1.24.4

# 这里是因为内核版本过低报错,如果升级过内核,请忽略
error execution phase preflight: [preflight] Some fatal errors occurred:
	[ERROR SystemVerification]: unexpected kernel config: CONFIG_CGROUP_PIDS
	[ERROR SystemVerification]: missing required cgroups: pids

报错:[ERROR SystemVerification]: unexpected kernel config: CONFIG_CGROUP_PIDS
[ERROR SystemVerification]: missing required cgroups: pids

解决:升级内核

[root@k8s cgroup]# uname -r
3.10.0-327.el7.x86_64

导入EL repo库
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm

[root@k8s cgroup]# yum --disablerepo="*" --enablerepo="elrepo-kernel" list available
可安装的软件包
elrepo-release.noarch          
kernel-lt.x86_64   
kernel-lt-devel.x86_64 
kernel-lt-doc.noarch 
kernel-lt-headers.x86_64 
kernel-lt-tools.x86_64  
kernel-lt-tools-libs.x86_64   
kernel-lt-tools-libs-devel.x86_64   
kernel-ml.x86_64       
kernel-ml-devel.x86_64       
kernel-ml-doc.noarch     
kernel-ml-headers.x86_64      
kernel-ml-tools.x86_64        
kernel-ml-tools-libs.x86_64          
kernel-ml-tools-libs-devel.x86_64      
perf.x86_64                            
python-perf.x86_64      

安装稳定内核
yum --enablerepo=elrepo-kernel install kernel-ml

修改GRUB选项,使新安装的内核作为优先启动
cp /etc/default/grub  /etc/default/grub_bak
[root@k8s cgroup]# vim /etc/default/grub
[root@k8s cgroup]# cat /etc/default/grub
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
# GRUB_DEFAULT=saved-->GRUB_DEFAULT=0
GRUB_DEFAULT=0
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet"
GRUB_DISABLE_RECOVERY="true"

重新创建内核配置
[root@k8s cgroup]# grub2-mkconfig -o /boot/grub2/grub.cfg
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-5.19.8-1.el7.elrepo.x86_64
Found initrd image: /boot/initramfs-5.19.8-1.el7.elrepo.x86_64.img
Found linux image: /boot/vmlinuz-3.10.0-327.el7.x86_64
Found initrd image: /boot/initramfs-3.10.0-327.el7.x86_64.img
Found linux image: /boot/vmlinuz-0-rescue-575e24cf52124364b060acab9088f9b8
Found initrd image: /boot/initramfs-0-rescue-575e24cf52124364b060acab9088f9b8.img
done

重启验证
reboot
uname -r
5.19.8-1.el7.elrepo.x86_64
kubeadm init --image-repository registry.aliyuncs.com/google_containers --cri-socket unix://var/run/cri-dockerd.sock --ignore-preflight-errors=NumCPU --service-cidr=10.10.0.0/16 --pod-network-cidr=10.122.0.0/16 --kubernetes-version=1.24.4

# 这里是因为镜像太大,没能拉取成功。可以直接导入我网盘里的镜像或者手动拉取需要的镜像
error execution phase preflight: [preflight] Some fatal errors occurred:
	[ERROR ImagePull]: failed to pull image registry.aliyuncs.com/google_containers/etcd:3.5.3-0: output: E0914 13:11:22.857372   17990 remote_image.go:218] "PullImage from image service failed" err="rpc error: code = Unknown desc = context deadline exceeded" image="registry.aliyuncs.com/google_containers/etcd:3.5.3-0"
time="2022-09-14T13:11:22+08:00" level=fatal msg="pulling image: rpc error: code = Unknown desc = context deadline exceeded"
, error: exit status 1

报错:[ERROR ImagePull]: failed to pull image registry.aliyuncs.com/google_containers/etcd:3.5.3-0: output: E0914 13:11:22.857372 17990 remote_image.go:218] “PullImage from image service failed” err=“rpc error: code = Unknown desc = context deadline exceeded” image=“registry.aliyuncs.com/google_containers/etcd:3.5.3-0”

原因:镜像etcd:3.5.3-0无法下载

解决:手动下载

查看需要的镜像
[root@k8s ~]# kubeadm config images list
I0914 14:02:13.369582   21306 version.go:255] remote version is much newer: v1.25.0; falling back to: stable-1.24
k8s.gcr.io/kube-apiserver:v1.24.4
k8s.gcr.io/kube-controller-manager:v1.24.4
k8s.gcr.io/kube-scheduler:v1.24.4
k8s.gcr.io/kube-proxy:v1.24.4
k8s.gcr.io/pause:3.7
k8s.gcr.io/etcd:3.5.3-0
k8s.gcr.io/coredns/coredns:v1.8.6

拉取需要的镜像
[root@k8s ~]# docker pull registry.aliyuncs.com/google_containers/etcd:3.5.3-0
3.5.3-0: Pulling from google_containers/etcd
36698cfa5275: Pull complete 
924f6cbb1ab3: Pull complete 
11ade7be2717: Pull complete 
8c6339f7974a: Pull complete 
d846fbeccd2d: Pull complete 
Digest: sha256:13f53ed1d91e2e11aac476ee9a0269fdda6cc4874eba903efd40daf50c55eee5
Status: Downloaded newer image for registry.aliyuncs.com/google_containers/etcd:3.5.3-0
registry.aliyuncs.com/google_containers/etcd:3.5.3-0

[root@k8s ~]# kubeadm init --image-repository registry.aliyuncs.com/google_containers --cri-socket unix://var/run/cri-dockerd.sock --ignore-preflight-errors=NumCPU --service-cidr=10.10.0.0/16 --pod-network-cidr=10.122.0.0/16  、--kubernetes-version=1.24.4

[kubelet-check] Initial timeout of 40s passed.
error execution phase upload-config/kubelet: Error writing Crisocket information for the control-plane node: nodes "k8s" not found
To see the stack trace of this error execute with --v=5 or higher

报错:error execution phase upload-config/kubelet: Error writing Crisocket information for the control-plane node: nodes “k8s” not found

解决:

swapoff -a && kubeadm reset

命令:kubeadm reset
报错:Found multiple CRI endpoints on the host. Please define which one do you wish to use by setting the 'criSocket' field in the kubeadm configuration file: unix:///var/run/containerd/containerd.sock, unix:///var/run/cri-dockerd.sock
解决:kubeadm reset --cri-socket unix://var/run/cri-dockerd.sock

swapoff -a && kubeadm reset --cri-socket unix://var/run/cri-dockerd.sock
systemctl daemon-reload && systemctl restart kubelet  && iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X
[root@k8s ~]# kubeadm init --image-repository registry.aliyuncs.com/google_containers --cri-socket unix://var/run/cri-dockerd.sock --ignore-preflight-errors=NumCPU --service-cidr=10.10.0.0/16 --pod-network-cidr=10.122.0.0/16 --kubernetes-version=1.24.4
I0914 14:56:03.338660   39811 version.go:255] remote version is much newer: v1.25.0; falling back to: stable-1.24
[init] Using Kubernetes version: v1.24.4
[preflight] Running pre-flight checks
[preflight] Pulling images required for setting up a Kubernetes cluster
[preflight] This might take a minute or two, depending on the speed of your internet connection
[preflight] You can also perform this action in beforehand using 'kubeadm config images pull'
[certs] Using certificateDir folder "/etc/kubernetes/pki"
[certs] Generating "ca" certificate and key
[certs] Generating "apiserver" certificate and key
[certs] apiserver serving cert is signed for DNS names [k8s kubernetes kubernetes.default kubernetes.default.svc kubernetes.default.svc.cluster.local] and IPs [10.10.0.1 192.168.47.50]
[certs] Generating "apiserver-kubelet-client" certificate and key
[certs] Generating "front-proxy-ca" certificate and key
[certs] Generating "front-proxy-client" certificate and key
[certs] Generating "etcd/ca" certificate and key
[certs] Generating "etcd/server" certificate and key
[certs] etcd/server serving cert is signed for DNS names [k8s localhost] and IPs [192.168.47.50 127.0.0.1 ::1]
[certs] Generating "etcd/peer" certificate and key
[certs] etcd/peer serving cert is signed for DNS names [k8s localhost] and IPs [192.168.47.50 127.0.0.1 ::1]
[certs] Generating "etcd/healthcheck-client" certificate and key
[certs] Generating "apiserver-etcd-client" certificate and key
[certs] Generating "sa" key and public key
[kubeconfig] Using kubeconfig folder "/etc/kubernetes"
[kubeconfig] Writing "admin.conf" kubeconfig file
[kubeconfig] Writing "kubelet.conf" kubeconfig file
[kubeconfig] Writing "controller-manager.conf" kubeconfig file
[kubeconfig] Writing "scheduler.conf" kubeconfig file
[kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env"
[kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml"
[kubelet-start] Starting the kubelet
[control-plane] Using manifest folder "/etc/kubernetes/manifests"
[control-plane] Creating static Pod manifest for "kube-apiserver"
[control-plane] Creating static Pod manifest for "kube-controller-manager"
[control-plane] Creating static Pod manifest for "kube-scheduler"
[etcd] Creating static Pod manifest for local etcd in "/etc/kubernetes/manifests"
[wait-control-plane] Waiting for the kubelet to boot up the control plane as static Pods from directory "/etc/kubernetes/manifests". This can take up to 4m0s
[apiclient] All control plane components are healthy after 8.503409 seconds
[upload-config] Storing the configuration used in ConfigMap "kubeadm-config" in the "kube-system" Namespace
[kubelet] Creating a ConfigMap "kubelet-config" in namespace kube-system with the configuration for the kubelets in the cluster
[upload-certs] Skipping phase. Please see --upload-certs
[mark-control-plane] Marking the node k8s as control-plane by adding the labels: [node-role.kubernetes.io/control-plane node.kubernetes.io/exclude-from-external-load-balancers]
[mark-control-plane] Marking the node k8s as control-plane by adding the taints [node-role.kubernetes.io/master:NoSchedule node-role.kubernetes.io/control-plane:NoSchedule]
[bootstrap-token] Using token: j5h4wu.crmpe07onlh5h0o8
[bootstrap-token] Configuring bootstrap tokens, cluster-info ConfigMap, RBAC Roles
[bootstrap-token] Configured RBAC rules to allow Node Bootstrap tokens to get nodes
[bootstrap-token] Configured RBAC rules to allow Node Bootstrap tokens to post CSRs in order for nodes to get long term certificate credentials
[bootstrap-token] Configured RBAC rules to allow the csrapprover controller automatically approve CSRs from a Node Bootstrap Token
[bootstrap-token] Configured RBAC rules to allow certificate rotation for all node client certificates in the cluster
[bootstrap-token] Creating the "cluster-info" ConfigMap in the "kube-public" namespace
[kubelet-finalize] Updating "/etc/kubernetes/kubelet.conf" to point to a rotatable kubelet client certificate and key
[addons] Applied essential addon: CoreDNS
[addons] Applied essential addon: kube-proxy

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

Alternatively, if you are the root user, you can run:

  export KUBECONFIG=/etc/kubernetes/admin.conf

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.47.50:6443 --token j5h4wu.crmpe07onlh5h0o8 \
	--discovery-token-ca-cert-hash sha256:0af083946d013ec301d311bc19a784be123f5baa15ca7cb2de12c292e288635e 

按要求执行
[root@k8s ~]# mkdir -p $HOME/.kube
[root@k8s ~]# cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@k8s ~]# chown $(id -u):$(id -g) $HOME/.kube/config
[root@k8s ~]# export KUBECONFIG=/etc/kubernetes/admin.conf

kubectl命令补全

yum install -y bash-completion
source /usr/share/bash-completion/bash_completion
source <(kubectl completion bash)
echo "source <(kubectl completion bash)" >> ~/.bashrc

安装网络flannel

  • 安装 flannel网络插件
echo 52.74.223.119 github.com >> /etc/hosts
echo 192.30.253.119 gist.github.com >> /etc/hosts
echo 54.169.195.247 api.github.com >> /etc/hosts
echo 185.199.111.153 assets-cdn.github.com >> /etc/hosts
echo 151.101.64.133 raw.githubusercontent.com >> /etc/hosts
echo 151.101.108.133 user-images.githubusercontent.com >> /etc/hosts
echo 151.101.76.133 gist.githubusercontent.com >> /etc/hosts
echo 151.101.76.133 cloud.githubusercontent.com >> /etc/hosts
echo 151.101.76.133 camo.githubusercontent.com >> /etc/hosts
echo 151.101.76.133 avatars0.githubusercontent.com >> /etc/hosts
echo 151.101.76.133 avatars1.githubusercontent.com >> /etc/hosts
echo 151.101.76.133 avatars2.githubusercontent.com >> /etc/hosts
echo 151.101.76.133 avatars3.githubusercontent.com >> /etc/hosts
echo 151.101.76.133 avatars4.githubusercontent.com >> /etc/hosts
echo 151.101.76.133 avatars5.githubusercontent.com >> /etc/hosts
echo 151.101.76.133 avatars6.githubusercontent.com >> /etc/hosts
echo 151.101.76.133 avatars7.githubusercontent.com >> /etc/hosts
echo 151.101.76.133 avatars8.githubusercontent.com >> /etc/hosts

[root@k8s ~]# wget --no-check-certificate https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

[root@k8s ~]# vim kube-flannel.yml 
  net-conf.json: |
    {
      "Network": "10.122.0.0/16",
      "Backend": {
        "Type": "vxlan"
      }
    }

[root@k8s ~]# kubectl apply -f kube-flannel.yml
[root@k8s ~]# kubectl get pods --all-namespaces
NAMESPACE      NAME                          READY   STATUS              RESTARTS        AGE
kube-flannel   kube-flannel-ds-6t62g         1/1     Running             0               30s
kube-system    coredns-74586cf9b6-jbvtt      0/1     ContainerCreating   0               10m
kube-system    coredns-74586cf9b6-q5mlw      0/1     ContainerCreating   0               157m
kube-system    etcd-k8s                      1/1     Running             1 (38m ago)     158m
kube-system    kube-apiserver-k8s            1/1     Running             1 (37m ago)     158m
kube-system    kube-controller-manager-k8s   1/1     Running             8 (7m20s ago)   158m
kube-system    kube-proxy-qdm7z              1/1     Running             1 (38m ago)     157m
kube-system    kube-scheduler-k8s            1/1     Running             8 (7m20s ago)   158m
[root@k8s ~]# kubectl describe pod coredns-74586cf9b6-jbvtt -n kube-system 
  Warning  FailedCreatePodSandBox  4m46s                kubelet            Failed to create pod sandbox: rpc error: code = Unknown desc = [failed to set up sandbox container "23afc3b1f16600c4139d25c54f0cc0f802ddc356b11d3962d405d2892d0b44bb" network for pod "coredns-74586cf9b6-jbvtt": networkPlugin cni failed to set up pod "coredns-74586cf9b6-jbvtt_kube-system" network: error getting ClusterInformation: connection is unauthorized: Unauthorized, failed to clean up sandbox container "23afc3b1f16600c4139d25c54f0cc0f802ddc356b11d3962d405d2892d0b44bb" network for pod "coredns-74586cf9b6-jbvtt": networkPlugin cni failed to teardown pod "coredns-74586cf9b6-jbvtt_kube-system" network: error getting ClusterInformation: connection is unauthorized: Unauthorized]

报错:Failed to create pod sandbox: rpc error: code = Unknown desc = [failed to set up sandbox container “23afc3b1f16600c4139d25c54f0cc0f802ddc356b11d3962d405d2892d0b44bb” network for pod “coredns-74586cf9b6-jbvtt”: networkPlugin cni failed to set up pod “coredns-74586cf9b6-jbvtt_kube-system” network: error getting ClusterInformation: connection is unauthorized: Unauthorized, failed to clean up sandbox container “23afc3b1f16600c4139d25c54f0cc0f802ddc356b11d3962d405d2892d0b44bb” network for pod “coredns-74586cf9b6-jbvtt”: networkPlugin cni failed to teardown pod “coredns-74586cf9b6-jbvtt_kube-system” network: error getting ClusterInformation: connection is unauthorized: Unauthorized]

原因:卸载calico有残留

解决:

[root@k8s ~]# ipvsadm --clear
[root@k8s ~]# rm -rf /etc/cni/net.d/
[root@k8s ~]# kubectl delete -f kube-flannel.yml 
[root@k8s ~]# kubectl create -f kube-flannel.yml 
[root@k8s ~]# kubectl get pods --all-namespaces
NAMESPACE      NAME                          READY   STATUS    RESTARTS        AGE
kube-flannel   kube-flannel-ds-6t62g         1/1     Running   0               36s
kube-system    coredns-74586cf9b6-jbvtt      1/1     Running   0               10m
kube-system    coredns-74586cf9b6-q5mlw      1/1     Running   0               157m
kube-system    etcd-k8s                      1/1     Running   1 (38m ago)     158m
kube-system    kube-apiserver-k8s            1/1     Running   1 (38m ago)     158m
kube-system    kube-controller-manager-k8s   1/1     Running   8 (7m26s ago)   158m
kube-system    kube-proxy-qdm7z              1/1     Running   1 (38m ago)     157m
kube-system    kube-scheduler-k8s            1/1     Running   8 (7m26s ago)   158m

子节点配置

查看加入集群的命令
[root@k8s ~]# kubeadm token create --print-join-command
kubeadm join 192.168.47.50:6443 --token 0i4x0o.zkrwba68j2pf19um --discovery-token-ca-cert-hash sha256:473f633d586094fc423a1c1544fbef44dc46c736c747b8b6bfc6343207e10650 

加入集群
kubeadm join 192.168.47.50:6443 --token j5h4wu.crmpe07onlh5h0o8 --discovery-token-ca-cert-hash sha256:0af083946d013ec301d311bc19a784be123f5baa15ca7cb2de12c292e288635e --cri-socket unix://var/run/cri-dockerd.sock

[root@k8s ~]# kubectl get nodes
NAME        STATUS     ROLES           AGE    VERSION
k8s         Ready      control-plane   170m   v1.24.4
k8s-node    NotReady             74s    v1.24.4
k8s-node2   NotReady             54s    v1.24.4

查看日志
journalctl -xeu kubelet -l
Container runtime network not ready" networkReady="NetworkReady=false reason:NetworkPluginNotReady message:docker: network plugin is not ready: cni config uninitialized"

报错:Container runtime network not ready" networkReady=“NetworkReady=false reason:NetworkPluginNotReady message:docker: network plugin is not ready: cni config uninitialized”

解决:拷贝master上/etc/cni/net.d 目录下的文件到有问题的节点上

mkdir -p /etc/cni/net.d/
scp k8s:/etc/cni/net.d/* /etc/cni/net.d/
[root@k8s ~]# kubectl get nodes
NAME        STATUS   ROLES           AGE    VERSION
k8s         Ready    control-plane   3h2m   v1.24.4
k8s-node    Ready              12m    v1.24.4
k8s-node2   Ready              12m    v1.24.4

安装ingress-nginx

  • 下载yaml
mkdir -p nginx-ingress
cd nginx-ingress
curl -O https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.2.0/deploy/static/provider/cloud/deploy.yaml
  • yaml内容(这里是解决报错后的版本,可以直接复制)
apiVersion: v1
kind: Namespace
metadata:
  labels:
    app.kubernetes.io/instance: ingress-nginx
    app.kubernetes.io/name: ingress-nginx
  name: ingress-nginx
---
apiVersion: v1
automountServiceAccountToken: true
kind: ServiceAccount
metadata:
  labels:
    app.kubernetes.io/component: controller
    app.kubernetes.io/instance: ingress-nginx
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
    app.kubernetes.io/version: 1.2.0
  name: ingress-nginx
  namespace: ingress-nginx
---
apiVersion: v1
kind: ServiceAccount
metadata:
  labels:
    app.kubernetes.io/component: admission-webhook
    app.kubernetes.io/instance: ingress-nginx
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
    app.kubernetes.io/version: 1.2.0
  name: ingress-nginx-admission
  namespace: ingress-nginx
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  labels:
    app.kubernetes.io/component: controller
    app.kubernetes.io/instance: ingress-nginx
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
    app.kubernetes.io/version: 1.2.0
  name: ingress-nginx
  namespace: ingress-nginx
rules:
- apiGroups:
  - ""
  resources:
  - namespaces
  verbs:
  - get
- apiGroups:
  - ""
  resources:
  - configmaps
  - pods
  - secrets
  - endpoints
  verbs:
  - get
  - list
  - watch
- apiGroups:
  - ""
  resources:
  - services
  verbs:
  - get
  - list
  - watch
- apiGroups:
  - networking.k8s.io
  resources:
  - ingresses
  verbs:
  - get
  - list
  - watch
- apiGroups:
  - networking.k8s.io
  resources:
  - ingresses/status
  verbs:
  - update
- apiGroups:
  - networking.k8s.io
  resources:
  - ingressclasses
  verbs:
  - get
  - list
  - watch
- apiGroups:
  - ""
  resourceNames:
  - ingress-controller-leader
  resources:
  - configmaps
  verbs:
  - get
  - update
- apiGroups:
  - ""
  resources:
  - configmaps
  verbs:
  - create
- apiGroups:
  - ""
  resources:
  - events
  verbs:
  - create
  - patch
- apiGroups:
  - ""
  resources:
  - configmaps
  verbs:
  - update
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  labels:
    app.kubernetes.io/component: admission-webhook
    app.kubernetes.io/instance: ingress-nginx
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
    app.kubernetes.io/version: 1.2.0
  name: ingress-nginx-admission
  namespace: ingress-nginx
rules:
- apiGroups:
  - ""
  resources:
  - secrets
  verbs:
  - get
  - create
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  labels:
    app.kubernetes.io/instance: ingress-nginx
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
    app.kubernetes.io/version: 1.2.0
  name: ingress-nginx
rules:
- apiGroups:
  - ""
  resources:
  - configmaps
  - endpoints
  - nodes
  - pods
  - secrets
  - namespaces
  verbs:
  - list
  - watch
- apiGroups:
  - ""
  resources:
  - nodes
  verbs:
  - get
- apiGroups:
  - ""
  resources:
  - services
  verbs:
  - get
  - list
  - watch
- apiGroups:
  - networking.k8s.io
  resources:
  - ingresses
  verbs:
  - get
  - list
  - watch
- apiGroups:
  - ""
  resources:
  - events
  verbs:
  - create
  - patch
- apiGroups:
  - networking.k8s.io
  resources:
  - ingresses/status
  verbs:
  - update
- apiGroups:
  - networking.k8s.io
  resources:
  - ingressclasses
  verbs:
  - get
  - list
  - watch
- apiGroups:
  - "extensions"
  - "networking.k8s.io"
  resources:
    - ingresses
  verbs:
    - list
    - watch
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  labels:
    app.kubernetes.io/component: admission-webhook
    app.kubernetes.io/instance: ingress-nginx
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
    app.kubernetes.io/version: 1.2.0
  name: ingress-nginx-admission
rules:
- apiGroups:
  - admissionregistration.k8s.io
  resources:
  - validatingwebhookconfigurations
  verbs:
  - get
  - update
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  labels:
    app.kubernetes.io/component: controller
    app.kubernetes.io/instance: ingress-nginx
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
    app.kubernetes.io/version: 1.2.0
  name: ingress-nginx
  namespace: ingress-nginx
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: ingress-nginx
subjects:
- kind: ServiceAccount
  name: ingress-nginx
  namespace: ingress-nginx
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  labels:
    app.kubernetes.io/component: admission-webhook
    app.kubernetes.io/instance: ingress-nginx
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
    app.kubernetes.io/version: 1.2.0
  name: ingress-nginx-admission
  namespace: ingress-nginx
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: ingress-nginx-admission
subjects:
- kind: ServiceAccount
  name: ingress-nginx-admission
  namespace: ingress-nginx
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  labels:
    app.kubernetes.io/instance: ingress-nginx
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
    app.kubernetes.io/version: 1.2.0
  name: ingress-nginx
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: ingress-nginx
subjects:
- kind: ServiceAccount
  name: ingress-nginx
  namespace: ingress-nginx
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  labels:
    app.kubernetes.io/component: admission-webhook
    app.kubernetes.io/instance: ingress-nginx
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
    app.kubernetes.io/version: 1.2.0
  name: ingress-nginx-admission
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: ingress-nginx-admission
subjects:
- kind: ServiceAccount
  name: ingress-nginx-admission
  namespace: ingress-nginx
---
apiVersion: v1
data:
  allow-snippet-annotations: "true"
kind: ConfigMap
metadata:
  labels:
    app.kubernetes.io/component: controller
    app.kubernetes.io/instance: ingress-nginx
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
    app.kubernetes.io/version: 1.2.0
  name: ingress-nginx-controller
  namespace: ingress-nginx
---
apiVersion: v1
kind: Service
metadata:
  labels:
    app.kubernetes.io/component: controller
    app.kubernetes.io/instance: ingress-nginx
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
    app.kubernetes.io/version: 1.2.0
  name: ingress-nginx-controller
  namespace: ingress-nginx
spec:
  externalTrafficPolicy: Local
  ports:
  - appProtocol: http
    name: http
    port: 80
    protocol: TCP
    targetPort: http
  - appProtocol: https
    name: https
    port: 443
    protocol: TCP
    targetPort: https
  selector:
    app.kubernetes.io/component: controller
    app.kubernetes.io/instance: ingress-nginx
    app.kubernetes.io/name: ingress-nginx
  type: LoadBalancer
---
apiVersion: v1
kind: Service
metadata:
  labels:
    app.kubernetes.io/component: controller
    app.kubernetes.io/instance: ingress-nginx
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
    app.kubernetes.io/version: 1.2.0
  name: ingress-nginx-controller-admission
  namespace: ingress-nginx
spec:
  ports:
  - appProtocol: https
    name: https-webhook
    port: 443
    targetPort: webhook
  selector:
    app.kubernetes.io/component: controller
    app.kubernetes.io/instance: ingress-nginx
    app.kubernetes.io/name: ingress-nginx
  type: ClusterIP
---
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app.kubernetes.io/component: controller
    app.kubernetes.io/instance: ingress-nginx
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
    app.kubernetes.io/version: 1.2.0
  name: ingress-nginx-controller
  namespace: ingress-nginx
spec:
  minReadySeconds: 0
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      app.kubernetes.io/component: controller
      app.kubernetes.io/instance: ingress-nginx
      app.kubernetes.io/name: ingress-nginx
  template:
    metadata:
      labels:
        app.kubernetes.io/component: controller
        app.kubernetes.io/instance: ingress-nginx
        app.kubernetes.io/name: ingress-nginx
    spec:
      containers:
      - args:
        - /nginx-ingress-controller
        - --publish-service=$(POD_NAMESPACE)/ingress-nginx-controller
        - --election-id=ingress-controller-leader
        - --controller-class=k8s.io/ingress-nginx
        - --ingress-class=nginx
        - --configmap=$(POD_NAMESPACE)/ingress-nginx-controller
        - --validating-webhook=:8443
        - --validating-webhook-certificate=/usr/local/certificates/cert
        - --validating-webhook-key=/usr/local/certificates/key
        env:
        - name: POD_NAME
          valueFrom:
            fieldRef:
              fieldPath: metadata.name
        - name: POD_NAMESPACE
          valueFrom:
            fieldRef:
              fieldPath: metadata.namespace
        - name: LD_PRELOAD
          value: /usr/local/lib/libmimalloc.so
        image: bitnami/nginx-ingress-controller
        imagePullPolicy: IfNotPresent
        lifecycle:
          preStop:
            exec:
              command:
              - /wait-shutdown
        livenessProbe:
          failureThreshold: 5
          httpGet:
            path: /healthz
            port: 10254
            scheme: HTTP
          initialDelaySeconds: 10
          periodSeconds: 10
          successThreshold: 1
          timeoutSeconds: 1
        name: controller
        ports:
        - containerPort: 80
          name: http
          protocol: TCP
        - containerPort: 443
          name: https
          protocol: TCP
        - containerPort: 8443
          name: webhook
          protocol: TCP
        readinessProbe:
          failureThreshold: 3
          httpGet:
            path: /healthz
            port: 10254
            scheme: HTTP
          initialDelaySeconds: 10
          periodSeconds: 10
          successThreshold: 1
          timeoutSeconds: 1
        resources:
          requests:
            cpu: 100m
            memory: 90Mi
        securityContext:
          allowPrivilegeEscalation: true
          capabilities:
            add:
            - NET_BIND_SERVICE
            drop:
            - ALL
          runAsUser: 101
        volumeMounts:
        - mountPath: /usr/local/certificates/
          name: webhook-cert
          readOnly: true
      dnsPolicy: ClusterFirst
      nodeSelector:
        kubernetes.io/os: linux
      serviceAccountName: ingress-nginx
      terminationGracePeriodSeconds: 300
      volumes:
      - name: webhook-cert
        secret:
          secretName: ingress-nginx-admission
---
apiVersion: batch/v1
kind: Job
metadata:
  labels:
    app.kubernetes.io/component: admission-webhook
    app.kubernetes.io/instance: ingress-nginx
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
    app.kubernetes.io/version: 1.2.0
  name: ingress-nginx-admission-create
  namespace: ingress-nginx
spec:
  template:
    metadata:
      labels:
        app.kubernetes.io/component: admission-webhook
        app.kubernetes.io/instance: ingress-nginx
        app.kubernetes.io/name: ingress-nginx
        app.kubernetes.io/part-of: ingress-nginx
        app.kubernetes.io/version: 1.2.0
      name: ingress-nginx-admission-create
    spec:
      containers:
      - args:
        - create
        - --host=ingress-nginx-controller-admission,ingress-nginx-controller-admission.$(POD_NAMESPACE).svc
        - --namespace=$(POD_NAMESPACE)
        - --secret-name=ingress-nginx-admission
        env:
        - name: POD_NAMESPACE
          valueFrom:
            fieldRef:
              fieldPath: metadata.namespace
        image: dyrnq/kube-webhook-certgen:v1.1.1
        imagePullPolicy: IfNotPresent
        name: create
        securityContext:
          allowPrivilegeEscalation: false
      nodeSelector:
        kubernetes.io/os: linux
      restartPolicy: OnFailure
      securityContext:
        fsGroup: 2000
        runAsNonRoot: true
        runAsUser: 2000
      serviceAccountName: ingress-nginx-admission
---
apiVersion: batch/v1
kind: Job
metadata:
  labels:
    app.kubernetes.io/component: admission-webhook
    app.kubernetes.io/instance: ingress-nginx
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
    app.kubernetes.io/version: 1.2.0
  name: ingress-nginx-admission-patch
  namespace: ingress-nginx
spec:
  template:
    metadata:
      labels:
        app.kubernetes.io/component: admission-webhook
        app.kubernetes.io/instance: ingress-nginx
        app.kubernetes.io/name: ingress-nginx
        app.kubernetes.io/part-of: ingress-nginx
        app.kubernetes.io/version: 1.2.0
      name: ingress-nginx-admission-patch
    spec:
      containers:
      - args:
        - patch
        - --webhook-name=ingress-nginx-admission
        - --namespace=$(POD_NAMESPACE)
        - --patch-mutating=false
        - --secret-name=ingress-nginx-admission
        - --patch-failure-policy=Fail
        env:
        - name: POD_NAMESPACE
          valueFrom:
            fieldRef:
              fieldPath: metadata.namespace
        image: dyrnq/kube-webhook-certgen:v1.1.1
        imagePullPolicy: IfNotPresent
        name: patch
        securityContext:
          allowPrivilegeEscalation: false
      nodeSelector:
        kubernetes.io/os: linux
      restartPolicy: OnFailure
      securityContext:
        fsGroup: 2000
        runAsNonRoot: true
        runAsUser: 2000
      serviceAccountName: ingress-nginx-admission
---
apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
  labels:
    app.kubernetes.io/component: controller
    app.kubernetes.io/instance: ingress-nginx
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
    app.kubernetes.io/version: 1.2.0
  name: nginx
spec:
  controller: k8s.io/ingress-nginx
---
apiVersion: admissionregistration.k8s.io/v1
kind: ValidatingWebhookConfiguration
metadata:
  labels:
    app.kubernetes.io/component: admission-webhook
    app.kubernetes.io/instance: ingress-nginx
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
    app.kubernetes.io/version: 1.2.0
  name: ingress-nginx-admission
webhooks:
- admissionReviewVersions:
  - v1
  clientConfig:
    service:
      name: ingress-nginx-controller-admission
      namespace: ingress-nginx
      path: /networking/v1/ingresses
  failurePolicy: Fail
  matchPolicy: Equivalent
  name: validate.nginx.ingress.kubernetes.io
  rules:
  - apiGroups:
    - networking.k8s.io
    apiVersions:
    - v1
    operations:
    - CREATE
    - UPDATE
    resources:
    - ingresses
  sideEffects: None

提前拉镜像(如果需要,可以修改镜像名)
[root@k8s ~]# docker search nginx-ingress-controller 
[root@k8s ~]# docker pull bitnami/nginx-ingress-controller 
[root@k8s ~]# docker images
bitnami/nginx-ingress-controller                                  latest         80ae81101d41   8 months ago    388MB
[root@k8s ~]# docker tag bitnami/nginx-ingress-controller:latest bitnami/nginx-ingress-controller:v1.24.4
[root@k8s ~]# vim ingress-nginx.yaml 
      containers:
        - name: nginx-ingress-controller
          image: bitnami/nginx-ingress-controller:v1.24.4
[root@k8s-node2 ~]# docker pull dyrnq/kube-webhook-certgen:v1.1.1
v1.1.1: Pulling from dyrnq/kube-webhook-certgen
ec52731e9273: Pull complete 
b90aa28117d4: Pull complete 
Digest: sha256:64d8c73dca984af206adf9d6d7e46aa550362b1d7a01f3a0a91b20cc67868660
Status: Downloaded newer image for dyrnq/kube-webhook-certgen:v1.1.1
docker.io/dyrnq/kube-webhook-certgen:v1.1.1

[root@k8s nginx-ingress]# kubectl apply -f deploy.yaml 
namespace/ingress-nginx configured
serviceaccount/ingress-nginx created
serviceaccount/ingress-nginx-admission created
role.rbac.authorization.k8s.io/ingress-nginx created
role.rbac.authorization.k8s.io/ingress-nginx-admission created
clusterrole.rbac.authorization.k8s.io/ingress-nginx created
clusterrole.rbac.authorization.k8s.io/ingress-nginx-admission created
rolebinding.rbac.authorization.k8s.io/ingress-nginx created
rolebinding.rbac.authorization.k8s.io/ingress-nginx-admission created
clusterrolebinding.rbac.authorization.k8s.io/ingress-nginx created
clusterrolebinding.rbac.authorization.k8s.io/ingress-nginx-admission created
configmap/ingress-nginx-controller created
service/ingress-nginx-controller created
service/ingress-nginx-controller-admission created
deployment.apps/ingress-nginx-controller created
job.batch/ingress-nginx-admission-create created
job.batch/ingress-nginx-admission-patch created
ingressclass.networking.k8s.io/nginx created

[root@k8s nginx-ingress]# kubectl get pods -n ingress-nginx
NAME                                        READY   STATUS      RESTARTS   AGE
ingress-nginx-admission-create-zpscz        0/1     Completed   0          10m
ingress-nginx-admission-patch-fbcrj         0/1     Completed   0          10m
ingress-nginx-controller-599c66746c-g2rmw   1/1     Running     0          7m41s

查看日志
[root@k8s nginx-ingress]# kubectl logs -n ingress-nginx ingress-nginx-controller-599c66746c-g2rmw 
  • 日志报错解决

报错:Failed to list *v1beta1.Ingress: ingresses.networking.k8s.io is forbidden: User “system:serviceaccount:ingress-nginx:nginx-ingress-serviceaccount” cannot list resource “ingresses” in API group “networking.k8s.io” at the cluster scope

解决:编辑ingress的 mandatory.yaml 在ClusterRole位置添加下述代码然后重新apply -f 即可

- apiGroups:
  - "extensions"
  - "networking.k8s.io"
  resources:
  - ingresses
  verbs:
  - list
  - watch
  • 报错2

报错:Failed to update lock: configmaps “ingress-controller-leader” is forbidden: User “system:serviceaccount:ingress-nginx:nginx-ingress-serviceaccount” cannot update resource “configmaps” in API group “” in the namespace “ingress-nginx”

解决:编辑ingress的 mandatory.yaml 在Role位置添加下述代码然后重新apply -f 即可

- apiGroups:
  - ""
  resources:
  - configmaps
  verbs:
  - update
  • 正确日志输出
[root@k8s nginx-ingress]# kubectl logs -n ingress-nginx ingress-nginx-controller-599c66746c-g2rmw 
-------------------------------------------------------------------------------
NGINX Ingress controller
  Release:       1.1.0
  Build:         843a16a8
  Repository:    https://github.com/kubernetes/ingress-nginx
  nginx version: nginx/1.21.5

-------------------------------------------------------------------------------

W0920 05:48:25.803155       1 client_config.go:615] Neither --kubeconfig nor --master was specified.  Using the inClusterConfig.  This might not work.
I0920 05:48:25.894694       1 main.go:223] "Creating API client" host="https://10.10.0.1:443"
I0920 05:48:26.606925       1 main.go:267] "Running in Kubernetes cluster" major="1" minor="24" git="v1.24.4" state="clean" commit="95ee5ab382d64cfe6c28967f36b53970b8374491" platform="linux/amd64"
I0920 05:48:27.275437       1 main.go:104] "SSL fake certificate created" file="/etc/ingress-controller/ssl/default-fake-certificate.pem"
I0920 05:48:28.096131       1 ssl.go:531] "loading tls certificate" path="/usr/local/certificates/cert" key="/usr/local/certificates/key"
I0920 05:48:28.363220       1 nginx.go:255] "Starting NGINX Ingress controller"
I0920 05:48:28.510903       1 event.go:282] Event(v1.ObjectReference{Kind:"ConfigMap", Namespace:"ingress-nginx", Name:"ingress-nginx-controller", UID:"6b2a0e79-65f5-43b8-b05b-ad6c5d068a77", APIVersion:"v1", ResourceVersion:"11568", FieldPath:""}): type: 'Normal' reason: 'CREATE' ConfigMap ingress-nginx/ingress-nginx-controller
I0920 05:48:30.447454       1 nginx.go:297] "Starting NGINX process"
I0920 05:48:30.455756       1 leaderelection.go:248] attempting to acquire leader lease ingress-nginx/ingress-controller-leader...
I0920 05:48:30.455860       1 nginx.go:317] "Starting validation webhook" address=":8443" certPath="/usr/local/certificates/cert" keyPath="/usr/local/certificates/key"
I0920 05:48:30.461818       1 controller.go:155] "Configuration changes detected, backend reload required"
I0920 05:48:30.539493       1 status.go:84] "New leader elected" identity="nginx-ingress-controller-64cc4648b8-m8pxs"
I0920 05:48:33.551937       1 controller.go:172] "Backend successfully reloaded"
I0920 05:48:33.551996       1 controller.go:183] "Initial sync, sleeping for 1 second"
I0920 05:48:33.553113       1 event.go:282] Event(v1.ObjectReference{Kind:"Pod", Namespace:"ingress-nginx", Name:"ingress-nginx-controller-599c66746c-g2rmw", UID:"7413a1d0-e3b7-4a1e-99d2-8e704a9d2ae3", APIVersion:"v1", ResourceVersion:"11935", FieldPath:""}): type: 'Normal' reason: 'RELOAD' NGINX reload triggered due to a change in configuration
W0920 05:48:34.566596       1 controller.go:201] Dynamic reconfiguration failed: Post "http://127.0.0.1:10246/configuration/backends": dial tcp 127.0.0.1:10246: connect: connection refused
E0920 05:48:34.566632       1 controller.go:205] Unexpected failure reconfiguring NGINX:
Post "http://127.0.0.1:10246/configuration/backends": dial tcp 127.0.0.1:10246: connect: connection refused
E0920 05:48:34.566698       1 queue.go:130] "requeuing" err="Post \"http://127.0.0.1:10246/configuration/backends\": dial tcp 127.0.0.1:10246: connect: connection refused" key="initial-sync"
I0920 05:48:34.566826       1 controller.go:155] "Configuration changes detected, backend reload required"
I0920 05:48:34.723516       1 controller.go:172] "Backend successfully reloaded"
I0920 05:48:34.723679       1 controller.go:183] "Initial sync, sleeping for 1 second"
I0920 05:48:34.761308       1 event.go:282] Event(v1.ObjectReference{Kind:"Pod", Namespace:"ingress-nginx", Name:"ingress-nginx-controller-599c66746c-g2rmw", UID:"7413a1d0-e3b7-4a1e-99d2-8e704a9d2ae3", APIVersion:"v1", ResourceVersion:"11935", FieldPath:""}): type: 'Normal' reason: 'RELOAD' NGINX reload triggered due to a change in configuration
I0920 05:49:09.840584       1 status.go:84] "New leader elected" identity="ingress-nginx-controller-599c66746c-g2rmw"
I0920 05:49:09.841730       1 leaderelection.go:258] successfully acquired lease ingress-nginx/ingress-controller-leader
  • 测试使用
[root@k8s nginx-ingress]# kubectl create deploy echoserver --image=cilium/echoserver --replicas=2
deployment.apps/echoserver created
[root@k8s nginx-ingress]# kubectl get pods
NAME                          READY   STATUS    RESTARTS   AGE
echoserver-8585bfb456-75jps   1/1     Running   0          3m52s
echoserver-8585bfb456-scnld   1/1     Running   0          3m53s
[root@k8s nginx-ingress]# kubectl expose deployment echoserver --port=80
service/echoserver exposed
[root@k8s nginx-ingress]# kubectl get svc
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
echoserver   ClusterIP   10.10.197.110           80/TCP    38s
kubernetes   ClusterIP   10.10.0.1               443/TCP   165m

#正常情况会随机显示两个主机名
[root@k8s nginx-ingress]# curl http://10.10.197.110


Hostname: echoserver-8585bfb456-scnld

Pod Information:
	-no pod information available-

Server values:
	server_version=nginx: 1.13.3 - lua: 10008

Request Information:
	client_address=::ffff:10.122.0.0
	method=GET
	real path=/
	query=
	request_version=1.1
	request_scheme=http
	request_uri=http://10.10.197.110:80/

Request Headers:
	accept=*/*
	host=10.10.197.110
	user-agent=curl/7.29.0

Request Body:
	-no body in request-

[root@k8s nginx-ingress]# curl http://10.10.197.110


Hostname: echoserver-8585bfb456-75jps

Pod Information:
	-no pod information available-

Server values:
	server_version=nginx: 1.13.3 - lua: 10008

Request Information:
	client_address=::ffff:10.122.0.0
	method=GET
	real path=/
	query=
	request_version=1.1
	request_scheme=http
	request_uri=http://10.10.197.110:80/

Request Headers:
	accept=*/*
	host=10.10.197.110
	user-agent=curl/7.29.0

Request Body:
	-no body in request-
  • 测试nodeport
[root@k8s nginx-ingress]# kubectl get svc -n ingress-nginx
NAME                                 TYPE           CLUSTER-IP     EXTERNAL-IP   PORT(S)                      AGE
ingress-nginx-controller             LoadBalancer   10.10.68.162        80:31855/TCP,443:31968/TCP   23m
ingress-nginx-controller-admission   ClusterIP      10.10.229.71           443/TCP                      23m

开启nginx-ingress NodePort端口
[root@k8s nginx-ingress]# kubectl edit svc ingress-nginx-controller -n ingress-nginx
service/ingress-nginx-controller edited
#type改为NodePort
[root@k8s nginx-ingress]# kubectl get svc -n ingress-nginx
NAME                                 TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)                      AGE
ingress-nginx-controller             NodePort    10.10.68.162           80:31855/TCP,443:31968/TCP   25m
ingress-nginx-controller-admission   ClusterIP   10.10.229.71           443/TCP                      25m

[root@k8s nginx-ingress]# curl http://192.168.47.50:31855

404 Not Found<<span class="token operator">/</span>title><<span class="token operator">/</span>head>
<body>
<center><h1>404 Not Found<<span class="token operator">/</span>h1><<span class="token operator">/</span>center>
<hr><center>nginx<<span class="token operator">/</span>center>
<<span class="token operator">/</span>body>
<<span class="token operator">/</span>html>

配置ingress策略
<span class="token namespace">[root@k8s nginx-ingress]</span><span class="token comment"># vim ingress-echoserver-test.yaml </span>
<span class="token namespace">[root@k8s nginx-ingress]</span><span class="token comment"># cat ingress-echoserver-test.yaml </span>
apiVersion: networking<span class="token punctuation">.</span>k8s<span class="token punctuation">.</span>io/v1
kind: Ingress
metadata:
  name: ingress-echoserver-test
spec:
  rules:
  <span class="token operator">-</span> host: echoserver<span class="token punctuation">.</span>test
    http:
      paths:
      <span class="token operator">-</span> path: <span class="token operator">/</span>
        pathType: Prefix
        backend:
          service:
            name: echoserver
            port:
              number: 80
  ingressClassName: nginx
<span class="token namespace">[root@k8s nginx-ingress]</span><span class="token comment"># kubectl apply -f ingress-echoserver-test.yaml</span>
ingress<span class="token punctuation">.</span>networking<span class="token punctuation">.</span>k8s<span class="token punctuation">.</span>io/ingress-echoserver-test created
<span class="token namespace">[root@k8s nginx-ingress]</span><span class="token comment"># kubectl get ingress</span>
NAME                      <span class="token keyword">CLASS</span>   HOSTS             ADDRESS        PORTS   AGE
ingress-echoserver-test   nginx   echoserver<span class="token punctuation">.</span>test   10<span class="token punctuation">.</span>10<span class="token punctuation">.</span>68<span class="token punctuation">.</span>162   80      91s
<span class="token namespace">[root@k8s nginx-ingress]</span><span class="token comment"># curl -H "Host: echoserver.test" http://192.168.47.50:31855</span>


Hostname: echoserver-8585bfb456-75jps

Pod Information:
	<span class="token operator">-</span>no pod information available-

Server values:
	server_version=nginx: 1<span class="token punctuation">.</span>13<span class="token punctuation">.</span>3 <span class="token operator">-</span> lua: 10008

Request Information:
	client_address=::ffff:10<span class="token punctuation">.</span>122<span class="token punctuation">.</span>1<span class="token punctuation">.</span>8
	method=GET
	real path=<span class="token operator">/</span>
	query=
	request_version=1<span class="token punctuation">.</span>1
	request_scheme=http
	request_uri=http:<span class="token operator">/</span><span class="token operator">/</span>echoserver<span class="token punctuation">.</span>test:80/

Request Headers:
	accept=<span class="token operator">*</span><span class="token operator">/</span><span class="token operator">*</span>
	host=echoserver<span class="token punctuation">.</span>test
	user-agent=curl/7<span class="token punctuation">.</span>29<span class="token punctuation">.</span>0
	x-forwarded-<span class="token keyword">for</span>=10<span class="token punctuation">.</span>122<span class="token punctuation">.</span>0<span class="token punctuation">.</span>0
	x-forwarded-host=echoserver<span class="token punctuation">.</span>test
	x-forwarded-port=80
	x-forwarded-proto=http
	x-forwarded-scheme=http
	x-real-ip=10<span class="token punctuation">.</span>122<span class="token punctuation">.</span>0<span class="token punctuation">.</span>0
	x-<span class="token function">request-id</span>=57aa1432d2373b71fc966b7f08a01176
	x-scheme=http

Request Body:
	<span class="token operator">-</span>no body in request-
</code></pre> 
  <p><mark>到此k8s集群就搭建完成了,后续会有整个cicd流程的部署</mark></p> 
  <p><mark>如果有问题,可以直接评论区,我会很快回复的</mark></p> 
 </div> 
</div>������������������������������������������������
                            </div>
                        </div>
                    </div>
                    <!--PC和WAP自适应版-->
                    <div id="SOHUCS" sid="1579766775162159104"></div>
                    <script type="text/javascript" src="/views/front/js/chanyan.js"></script>
                    <!-- 文章页-底部 动态广告位 -->
                    <div class="youdao-fixed-ad" id="detail_ad_bottom"></div>
                </div>
                <div class="col-md-3">
                    <div class="row" id="ad">
                        <!-- 文章页-右侧1 动态广告位 -->
                        <div id="right-1" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad">
                            <div class="youdao-fixed-ad" id="detail_ad_1"> </div>
                        </div>
                        <!-- 文章页-右侧2 动态广告位 -->
                        <div id="right-2" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad">
                            <div class="youdao-fixed-ad" id="detail_ad_2"></div>
                        </div>
                        <!-- 文章页-右侧3 动态广告位 -->
                        <div id="right-3" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad">
                            <div class="youdao-fixed-ad" id="detail_ad_3"></div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
    <div class="container">
        <h4 class="pt20 mb15 mt0 border-top">你可能感兴趣的:(linux运维(所有),云计算,kubernetes,docker)</h4>
        <div id="paradigm-article-related">
            <div class="recommend-post mb30">
                <ul class="widget-links">
                    <li><a href="/article/1829824069399310336.htm"
                           title="搭建selenoid环境" target="_blank">搭建selenoid环境</a>
                        <span class="text-muted">野生猕猴桃</span>
<a class="tag" taget="_blank" href="/search/selenoid/1.htm">selenoid</a><a class="tag" taget="_blank" href="/search/selenoid-ui/1.htm">selenoid-ui</a><a class="tag" taget="_blank" href="/search/%E8%BF%9C%E7%A8%8B%E6%B5%8F%E8%A7%88%E5%99%A8/1.htm">远程浏览器</a>
                        <div>1、拉取浏览器镜像dockerpullselenoid/vnc:chrome_103.02、拉取selenoid-ui容器镜像dockerpullaerokube/selenoid-ui:1.10.43、拉取selenoid容器镜像dockerpullaerokube/selenoid4、编写配置文件vi/selenoid/config/browsers.jsonvolumes可以做容器路径映射,</div>
                    </li>
                    <li><a href="/article/1829823563046154240.htm"
                           title="jenkins 插件kubernetes配置详解" target="_blank">jenkins 插件kubernetes配置详解</a>
                        <span class="text-muted">haha wa</span>
<a class="tag" taget="_blank" href="/search/jenkins/1.htm">jenkins</a><a class="tag" taget="_blank" href="/search/kubernetes/1.htm">kubernetes</a><a class="tag" taget="_blank" href="/search/%E8%BF%90%E7%BB%B4/1.htm">运维</a><a class="tag" taget="_blank" href="/search/%E5%AE%B9%E5%99%A8/1.htm">容器</a><a class="tag" taget="_blank" href="/search/%E4%BA%91%E5%8E%9F%E7%94%9F/1.htm">云原生</a>
                        <div>配置,持续集成,Kubernetes,Jenkins相关视频讲解:C语言程序设计入门之环境安装Go语言工程化实践Prometheus监控系统介绍Jenkins插件Kubernetes配置详解Jenkins是一个开源的持续集成工具,而Kubernetes是一个开源的容器编排引擎。将这两者结合起来,可以实现更灵活、高效的持续集成和持续部署流程。本文将介绍如何在Jenkins中配置Kubernetes插</div>
                    </li>
                    <li><a href="/article/1829820535945654272.htm"
                           title="银行卡四要素验证如何用Java调用" target="_blank">银行卡四要素验证如何用Java调用</a>
                        <span class="text-muted">loosenivy</span>
<a class="tag" taget="_blank" href="/search/%E9%93%B6%E8%81%94%E7%B1%BB%E6%8E%A5%E5%8F%A3/1.htm">银联类接口</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E9%93%B6%E8%A1%8C%E5%8D%A1%E5%9B%9B%E8%A6%81%E7%B4%A0/1.htm">银行卡四要素</a><a class="tag" taget="_blank" href="/search/%E9%93%B6%E8%A1%8C%E5%8D%A1%E5%9B%9B%E8%A6%81%E7%B4%A0%E9%AA%8C%E8%AF%81/1.htm">银行卡四要素验证</a><a class="tag" taget="_blank" href="/search/%E9%93%B6%E8%A1%8C%E5%8D%A1%E5%9B%9B%E8%A6%81%E7%B4%A0%E8%AE%A4%E8%AF%81/1.htm">银行卡四要素认证</a><a class="tag" taget="_blank" href="/search/%E9%93%B6%E8%A1%8C%E5%8D%A1%E5%AE%9E%E5%90%8D%E8%AE%A4%E8%AF%81/1.htm">银行卡实名认证</a><a class="tag" taget="_blank" href="/search/%E9%93%B6%E8%A1%8C%E5%8D%A1%E8%AE%A4%E8%AF%81/1.htm">银行卡认证</a><a class="tag" taget="_blank" href="/search/%E9%93%B6%E8%A1%8C%E5%8D%A1%E6%A0%B8%E9%AA%8C/1.htm">银行卡核验</a>
                        <div>一、什么是银行卡四要素验证?银行卡四要素验证又叫银行卡四要素核验,银行卡实名核验,银行卡四元素验证,传入银行卡卡号、姓名、身份证号码、手机号,验证此四要素是否一致,支持所有带银联标识的银行卡。二、银行卡四要素验证适用场景有哪些?例如:金融领域:1.网络支付:在各类线上支付平台,验证用户银行卡信息的真实性,确保交易安全进行,例如电商购物支付场景中,快速核实用户身份与银行卡匹配情况,防止盗刷风险,保障</div>
                    </li>
                    <li><a href="/article/1829820283750543360.htm"
                           title="k8s-pod 实战三 (Liveness Probe 和 Readiness Probe 详细分析)" target="_blank">k8s-pod 实战三 (Liveness Probe 和 Readiness Probe 详细分析)</a>
                        <span class="text-muted">清风 001</span>
<a class="tag" taget="_blank" href="/search/K8S-Pod%E5%AE%9E%E6%88%98/1.htm">K8S-Pod实战</a><a class="tag" taget="_blank" href="/search/kubernetes/1.htm">kubernetes</a><a class="tag" taget="_blank" href="/search/%E5%AE%B9%E5%99%A8/1.htm">容器</a><a class="tag" taget="_blank" href="/search/%E4%BA%91%E5%8E%9F%E7%94%9F/1.htm">云原生</a>
                        <div>一、LivenessProbe和ReadinessProbe详细分析LivenessProbeLivenessProbe用于检查容器是否处于健康状态。如果探针失败,Kubernetes会杀死容器并根据重启策略决定是否重启。这对于检测和恢复应用程序中的死锁或其他致命错误非常有用。ReadinessProbeReadinessProbe用于检查容器是否准备好接受流量。如果探针失败,Kubernetes</div>
                    </li>
                    <li><a href="/article/1829819275431473152.htm"
                           title="kafka客户端连接测试" target="_blank">kafka客户端连接测试</a>
                        <span class="text-muted">磊-</span>
<a class="tag" taget="_blank" href="/search/go%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/1.htm">go学习笔记</a>
                        <div>客户端代码:packagemainimport("fmt""github.com/Shopify/sarama")//kafka示例代码funcmain(){//配置config:=sarama.NewConfig()//等待服务器所有副本都保存成功后的响应,即数据成功发送到kafka后返回的响应信息config.Producer.RequiredAcks=sarama.WaitForAll//随</div>
                    </li>
                    <li><a href="/article/1829815026224033792.htm"
                           title="LeetCode-056-合并区间" target="_blank">LeetCode-056-合并区间</a>
                        <span class="text-muted">刻苦驴哝</span>

                        <div>给出一个区间的集合,请合并所有重叠的区间。示例1:输入:intervals=[[1,3],[2,6],[8,10],[15,18]]输出:[[1,6],[8,10],[15,18]]解释:区间[1,3]和[2,6]重叠,将它们合并为[1,6].示例2:输入:intervals=[[1,4],[4,5]]输出:[[1,5]]解释:区间[1,4]和[4,5]可被视为重叠区间。来源:力扣(LeetCod</div>
                    </li>
                    <li><a href="/article/1829804403842969600.htm"
                           title="每日一题(顺序表)" target="_blank">每日一题(顺序表)</a>
                        <span class="text-muted">VIRGO_尽兴自在</span>
<a class="tag" taget="_blank" href="/search/leetcode/1.htm">leetcode</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/1.htm">数据结构</a><a class="tag" taget="_blank" href="/search/c%E8%AF%AD%E8%A8%80/1.htm">c语言</a>
                        <div>顺序表消失的数字轮转数组移除元素合并两个有序数组消失的数字数组nums包含从0到n的所有整数,但其中缺了一个。请编写代码找出那个缺失的整数。你有办法在O(n)时间内完成吗?注意:本题相对书上原题稍作改动示例1:输入:[3,0,1]输出:2示例2:输入:[9,6,4,2,3,5,7,0,1]输出:8思路:由于缺失一个数,所以可以先计算出0~n的异或结果,再依次与数组中的元素异或,最后的结果就是缺失的</div>
                    </li>
                    <li><a href="/article/1829803394227859456.htm"
                           title="1.5编程基础之循环控制01:求平均年龄" target="_blank">1.5编程基础之循环控制01:求平均年龄</a>
                        <span class="text-muted">来吗???</span>
<a class="tag" taget="_blank" href="/search/c%2B%2B/1.htm">c++</a><a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a>
                        <div>班上有学生若干名,给出每名学生的年龄(整数),求班上所有学生的平均年龄,保留到小数点后两位。、#include//头文件usingnamespacestd;//不用说intmain(){intn,s,sum=0;//创建变量,n表示输入几次,s是重复出入的变量,sum是把所有年龄加起来的变量cin>>n;//输入for(inti=0;i>s;//每次输入年龄sum+=s;//输入的年龄加在sum里</div>
                    </li>
                    <li><a href="/article/1829802637608972288.htm"
                           title="约瑟夫退圈问题(循环链表实现)" target="_blank">约瑟夫退圈问题(循环链表实现)</a>
                        <span class="text-muted">XYu12301</span>
<a class="tag" taget="_blank" href="/search/%E9%93%BE%E8%A1%A8/1.htm">链表</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/1.htm">数据结构</a>
                        <div>约瑟夫退圈问题:利用循环链表类实现约瑟夫退圈问题:n个人(不同id)围成一个圈,从startId(任意数)个开始报数m(任意数)个数,数m的人出列排成新队列,m清零,然后又从下一个人开始数m个数开始,数到m就出列接在新队列尾部,如此重复,直到所有人都出列为止,请输出出列的次序(依次输出出列人员的编号)。说明:参数n,stratId和m要通过输入确定,注意要考虑startId和m大于n的情况首先需要</div>
                    </li>
                    <li><a href="/article/1829798888702308352.htm"
                           title="合并两个有序链表的几种方法" target="_blank">合并两个有序链表的几种方法</a>
                        <span class="text-muted">BenOnTheRoad</span>

                        <div>目标:将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。例如输入以下两个链表:链表1:1->2->4,链表2:1->3->4输出:1->1->2->3->4->4递归比较两个链表的当前节点,当前值较小的作为返回的节点加入新链表,并将该节点的Next节点和另一个链表的当前节点递归比较作为新链表的Next节点。funcmergeTwoLists(l1*List</div>
                    </li>
                    <li><a href="/article/1829796712391208960.htm"
                           title="php treemap,关于TreeMap的个人理解" target="_blank">php treemap,关于TreeMap的个人理解</a>
                        <span class="text-muted">夜色冷浮华</span>
<a class="tag" taget="_blank" href="/search/php/1.htm">php</a><a class="tag" taget="_blank" href="/search/treemap/1.htm">treemap</a>
                        <div>群里的大哥说了,要想懂红黑树的应用,先要看TreeMap。OK,现在开始:红黑树简介红黑树又称红-黑二叉树,它首先是一颗二叉树,它具体二叉树所有的特性。同时红黑树更是一颗自平衡的排序二叉树。一般的二叉树他们都需要满足一个基本性质--即树中的任何节点的值大于它的左子节点,且小于它的右子节点。因为按照这个基本性质使得树的检索效率大大提高。但我们知道在生成二叉树的过程是非常容易失衡的,最坏的情况就是一边</div>
                    </li>
                    <li><a href="/article/1829796609416851456.htm"
                           title="概率为零的重逢" target="_blank">概率为零的重逢</a>
                        <span class="text-muted">陈老太太儿</span>

                        <div>两个人从相见相识到相知相守,多多少少经历了时间的洗礼,一旦两人分开,重逢的概率是零。不是说再也不见,而是说,分开后再重逢的你们,早已不是当初的你们,当初分开的人早已被时间消磨殆尽。重逢时,你还是你吗?他还是他吗?(一)我的身边没有你了小时候的我们总是会从老师那里听到各个班里各样的“别人家的孩子”,她便是其中一个,成绩优异,表现突出,大概所有“别人家的孩子”都是这样的吧。早已记不清第一次见到她的感觉</div>
                    </li>
                    <li><a href="/article/1829794440751968256.htm"
                           title="如何决定使用 HashMap 还是 TreeMap?" target="_blank">如何决定使用 HashMap 还是 TreeMap?</a>
                        <span class="text-muted">BugLovers</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a>
                        <div>在Java中,HashMap和TreeMap都是实现Map接口的集合类,但它们有不同的特性和使用场景。选择使用HashMap还是TreeMap,取决于具体需求和场景。以下是一些关键因素,可以帮助你决定使用哪一个:1.性能需求HashMap-插入、删除、查找的时间复杂度为O(1),这使得HashMap非常适合用于需要高效插入、删除和查找操作的场景。-哈希冲突:在最坏情况下,如果所有的键都在同一个桶中</div>
                    </li>
                    <li><a href="/article/1829793935422222336.htm"
                           title="vue3 路由的使用" target="_blank">vue3 路由的使用</a>
                        <span class="text-muted">前端不加班</span>
<a class="tag" taget="_blank" href="/search/vue3/1.htm">vue3</a><a class="tag" taget="_blank" href="/search/vue.js/1.htm">vue.js</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a>
                        <div>路由的使用在传统的Web开发过程中,当需要实现多个站内页面时,以前需要写很多个HTML页面,然后通过标签来实现互相跳转。在如今工程化模式下的前端开发,像Vue工程,可以轻松实现只用一个HTML文件,却能够完成多个站内页面渲染、跳转的功能,这就是路由。TIP从这里开始,所有包含到.vue文件引入的地方,可能会看到@xx/xx.vue这样的写法。@views是src/views的路径别名,@cp是sr</div>
                    </li>
                    <li><a href="/article/1829789018590638080.htm"
                           title="【Mysql】通过Keepalived搭建mysql双主高可用集群" target="_blank">【Mysql】通过Keepalived搭建mysql双主高可用集群</a>
                        <span class="text-muted">维运</span>
<a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">数据库</a><a class="tag" taget="_blank" href="/search/mysql/1.htm">mysql</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">数据库</a>
                        <div>一、环境信息主机名ip操作系统mysql版本VIP(虚拟ip)hadoop01192.168.10.200centos7_x865.7192.168.10.253hadoop03192.168.10.202centos7_x865.7二、mysql集群搭建两台节点,如果未部署mysql服务,部署文档请看【Mysql】mysql三种安装方式(二进制、yum、docker)-CSDN博客三、配置文件修</div>
                    </li>
                    <li><a href="/article/1829785258434850816.htm"
                           title="喜茶获B轮融资,难道仅仅只是因为消费升级?" target="_blank">喜茶获B轮融资,难道仅仅只是因为消费升级?</a>
                        <span class="text-muted">孟永辉</span>

                        <div>人们对于奶茶的想象力在消费升级的风口之下被无限放大。喜茶获得B轮融资便是一个最为直接的例证。严格意义上的风口并不是所有人都意识到的时候,你才去做。而是当别人还没有意识到的时候,你已经开始做了。这或许正是喜茶之所以获得B轮融资的关键所在。这个诞生于一个小巷的奶茶品牌之所以会在如此短的时间内轮番获得融资,除了品牌本身的个性之外,更多的人会认为它抓住了消费升级的风口,并在这个风口之下一路向前。但是,喜茶</div>
                    </li>
                    <li><a href="/article/1829774707713470464.htm"
                           title="你有感知幸福的能力吗?" target="_blank">你有感知幸福的能力吗?</a>
                        <span class="text-muted">静候花开_7090</span>

                        <div>著名记者白岩松曾经出版过一本书《幸福了吗?》当时社会上的反响还是很大的,甚至还有记者走到路边街头去问行人,你幸福吗?成人的世界觉得幸福的不太多。今天我带孩子们阅读的是大师经典哲学绘本系列“孩子是天生的哲学家”之《万能原始人》,这个故事讲的是人还住在山洞里时,除了有用不完的时间、讲不完的故事和看不完的星星之外,便一无所有了,他们很快乐,但似乎也没有那么快乐,后来,聪明的人发明了楼房、床、燃气灶以及各</div>
                    </li>
                    <li><a href="/article/1829772156469342208.htm"
                           title="PG数据库中表所占用空间大小查询" target="_blank">PG数据库中表所占用空间大小查询</a>
                        <span class="text-muted">DXnima</span>

                        <div>查看所有表所占磁盘空间大小selectsum(t.size)from(SELECTtable_schema||'.'||table_nameAStable_full_name,pg_total_relation_size('"'||table_schema||'"."'||table_name||'"')ASsizeFROMinformation_schema.tablesORDERBYpg_to</div>
                    </li>
                    <li><a href="/article/1829771872426881024.htm"
                           title="nrm|npm快速切源" target="_blank">nrm|npm快速切源</a>
                        <span class="text-muted">在你之后</span>
<a class="tag" taget="_blank" href="/search/npm/1.htm">npm</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/node.js/1.htm">node.js</a>
                        <div>npmERR!auditYourconfiguredregistry(https://registry.npmmirror.com/)doesnotsupportauditrequests.直接切源就ok了全局安装$npmi-gnrm查看所有源$nrmls*npm--------https://registry.npmjs.org/yarn-------https://registry.yarnp</div>
                    </li>
                    <li><a href="/article/1829771646806880256.htm"
                           title="2019-07-05" target="_blank">2019-07-05</a>
                        <span class="text-muted">ChaperonRouge</span>

                        <div>每日打卡姓名于妍公司无锡万千工品科技有限公司【日精进打卡第47天】【知~学习】《六项精进》1遍共49遍《大学》1遍共49遍一生精进1遍共2遍【经典名句分享】有没有变化,有没有成长,骗得了所有人,但是自己静下来反思,一定是最清楚的,大家一定要在最好的年华里面,活出最优秀的自己,逼自己,就是在打造更好的自己,我们总会老,在公司,在朋友,在家庭里面,我们将扮演什么样的角色,是由自己定的!【行~实践】一、</div>
                    </li>
                    <li><a href="/article/1829771367290073088.htm"
                           title="nvm常用命令" target="_blank">nvm常用命令</a>
                        <span class="text-muted">包淼淼</span>
<a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/%E8%BF%90%E7%BB%B4/1.htm">运维</a><a class="tag" taget="_blank" href="/search/%E6%9C%8D%E5%8A%A1%E5%99%A8/1.htm">服务器</a>
                        <div>nvmls:列出所有已安装的node版本nvmls-remote:列出所有远程服务器的版本(官方nodeversionlist)nvmlist:列出所有已安装的node版本nvmlistavailable:显示所有可下载的版本nvminstallstable:安装最新版nodenvminstall[node版本号]:安装指定版本nodenvmuninstall[node版本号]:删除已安装的指定版</div>
                    </li>
                    <li><a href="/article/1829768715248431104.htm"
                           title="触心朋友圈语录" target="_blank">触心朋友圈语录</a>
                        <span class="text-muted">搁浅的流年</span>

                        <div>1不能接受就改变,不能改变就接受。2“我说过的,我一定会回来,不管在哪、无论多远?!”——“我也说过,我一定会等你,不管多久、无论多晚?!”——3人到了某个年纪之后,能让我们走得更远的只有自律、积极和勤奋。4“所有的优越感,都来自于缺乏见识和缺乏悲悯。最高贵的优越,是不会给别人造成任何压力的。”——孟非5It'sOktohaveit,it'sOknottohaveit;it'sOknottofig</div>
                    </li>
                    <li><a href="/article/1829763422166806528.htm"
                           title="强化学习自定义环境基础知识" target="_blank">强化学习自定义环境基础知识</a>
                        <span class="text-muted">AI-星辰</span>
<a class="tag" taget="_blank" href="/search/%E5%BC%BA%E5%8C%96%E5%AD%A6%E4%B9%A0%E8%87%AA%E5%AE%9A%E4%B9%89%E7%8E%AF%E5%A2%83/1.htm">强化学习自定义环境</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0/1.htm">机器学习</a>
                        <div>1.引言本文旨在全面介绍OpenAIGym自定义环境的创建过程,重点解析其接口、关键属性和函数。本指南适合初学者深入了解强化学习环境的构建原理和实践方法。2.OpenAIGym环境基础OpenAIGym提供了一个标准化的接口,用于创建和使用强化学习环境。了解这个接口的核心组件是创建自定义环境的基础。2.1Env类所有Gym环境都继承自gym.Env类。这个基类定义了环境应该具有的基本结构和方法。i</div>
                    </li>
                    <li><a href="/article/1829762918233763840.htm"
                           title="JavaScript 中的深拷贝新宠:structuredClone() 函数详解" target="_blank">JavaScript 中的深拷贝新宠:structuredClone() 函数详解</a>
                        <span class="text-muted">芭拉拉小魔仙</span>
<a class="tag" taget="_blank" href="/search/js/1.htm">js</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a><a class="tag" taget="_blank" href="/search/ecmascript/1.htm">ecmascript</a>
                        <div>在JavaScript中,处理对象拷贝时,我们经常会遇到浅拷贝(shallowcopy)和深拷贝(deepcopy)的概念。浅拷贝只复制对象的第一层属性,如果属性值是引用类型(如对象、数组等),则只复制引用而不复制对象本身,这可能会导致原始数据被意外修改。而深拷贝则递归地复制对象及其所有子属性,确保原始数据和拷贝数据完全独立。传统上,JavaScript没有内置直接进行深拷贝的函数,开发者通常需要</div>
                    </li>
                    <li><a href="/article/1829761455134699520.htm"
                           title="早晨冥想15分钟,137天。" target="_blank">早晨冥想15分钟,137天。</a>
                        <span class="text-muted">飞扬_7</span>

                        <div>早上5:00起床,跑步、拉伸、练声。冥想15分钟。把《微习惯简单到不能再简单的自我健康管理法则》又大致看了一遍。把所有任务补齐。以后再不能有补作业这一项。金句137:当体内毒素过多,免疫系统或其他器官功能低落时。可能会引起病毒,细菌或真菌的增生与入侵。这时候就会发烧。发烧是人体为了反制这些入侵的病源菌而采取的一种调高体温的手段。</div>
                    </li>
                    <li><a href="/article/1829760267312001024.htm"
                           title="PHP 两个二维数组进行合并" target="_blank">PHP 两个二维数组进行合并</a>
                        <span class="text-muted">喜欢硬编码</span>
<a class="tag" taget="_blank" href="/search/PHP/1.htm">PHP</a><a class="tag" taget="_blank" href="/search/php/1.htm">php</a>
                        <div>2020年11月25日下午16:03:31lijianz原文链接:业务场景假设需要查询出一个表中的所有联系人数据,由于数据过于庞大,不能将数据表内的数据一次性全部查询出来,只能按照分页查询进行进一步的筛选数据,如果需要返回某些用户状态,比如上线,置顶聊天等等。那么必须操作两个数组,一个数组按照分页查询用户数据,一个数组按照某个条件查询某状态的用户数据//arr1数组是查询某状态的用户数据(固定每页</div>
                    </li>
                    <li><a href="/article/1829756123553558528.htm"
                           title="电影《消失的她》中,男主信息被篡改,是否侵犯隐私权?" target="_blank">电影《消失的她》中,男主信息被篡改,是否侵犯隐私权?</a>
                        <span class="text-muted">虎梨儿</span>

                        <div>最近上线的电影《消失的她》受到大众好评,观众纷纷认为这是一部全程高能的悬疑剧。当电影开幕后,我们就会跟随着朱一龙的脚步,去寻找他那失踪的妻子。影片开始的时候,朱一龙主演的何非为了寻找妻子屡次闯入警察局,随着签证要到期的紧张感,让人身临其境。何非在宿醉之后醒来发现妻子已经回来了,但是他表示:这并非自己的妻子!但是身份信息、手机照片、酒店员工指证、视频监控……所有证据都指向她就是李木子。这时电视里出现</div>
                    </li>
                    <li><a href="/article/1829755981475704832.htm"
                           title="一个操作系统的设计与实现——第21章 高级可编程中断控制器" target="_blank">一个操作系统的设计与实现——第21章 高级可编程中断控制器</a>
                        <span class="text-muted">Tony小周</span>
<a class="tag" taget="_blank" href="/search/%E5%B5%8C%E5%85%A5%E5%BC%8F%E7%A1%AC%E4%BB%B6/1.htm">嵌入式硬件</a>
                        <div>21.1什么是高级可编程中断控制器我们已经使用过型号为8259A的可编程中断控制器(ProgrammableInterruptController,PIC)。在单CPU计算机中,中断的处理相对简单:所有的外设和CPU都连接在PIC上即可。然而,如果计算机中不止一个CPU,情况就会变得复杂起来。以双CPU为例:键盘中断会被每个CPU分别接收一次,这是错误的时钟中断会统一广播给各个CPU,这样做虽然没</div>
                    </li>
                    <li><a href="/article/1829754851064639488.htm"
                           title="余生漫长,而你最是难忘!" target="_blank">余生漫长,而你最是难忘!</a>
                        <span class="text-muted">唯美看点</span>

                        <div>总有一个人,还深深爱着,最终却失散于时光的拐角,甚至没来得及说一句再见,就已用尽了所有爱的力气。我们的故事不算长,也不难讲,只不过是相识一场,爱而不得,曾几何时,我天真的以为,所爱隔着山海,山海皆可平,可是我填平了山海,却发现你在云端,我连将来都想好了,你却半路放弃了,我们的爱情,就像来不及许愿的流星,再怎么美丽,也只能是曾经了。多少次为你乱了心跳,多少次为你湿了眼眶,当初许你一生的地方,也慢慢被</div>
                    </li>
                    <li><a href="/article/1829754084383617024.htm"
                           title="对儿子的肯定(20180702)" target="_blank">对儿子的肯定(20180702)</a>
                        <span class="text-muted">予心123</span>

                        <div>1.看到爸爸回来,内心非常开心,却对爸爸缅腆微笑。内敛矜持。2.主动提出帮忙妈妈做饭,端饭端菜洗碗。内在得到力量支持,体现出积极、主动、阳光、互助、协作的品质。3.与爸爸下棋、学习、玩玩具,能很好地与爸爸合作与链接。4.去小公园玩,可以很好的单独过马路,知道红灯停绿灯行,遵守交通规则。在公园参与陌生小朋友一起游戏,安全感越来越好,内在越来越打开。5.睡觉前能在提醒下收拾好所有的玩具并工整归位,自己</div>
                    </li>
                                <li><a href="/article/60.htm"
                                       title="Dom" target="_blank">Dom</a>
                                    <span class="text-muted">周华华</span>
<a class="tag" taget="_blank" href="/search/JavaScript/1.htm">JavaScript</a><a class="tag" taget="_blank" href="/search/html/1.htm">html</a>
                                    <div><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml&q</div>
                                </li>
                                <li><a href="/article/187.htm"
                                       title="【Spark九十六】RDD API之combineByKey" target="_blank">【Spark九十六】RDD API之combineByKey</a>
                                    <span class="text-muted">bit1129</span>
<a class="tag" taget="_blank" href="/search/spark/1.htm">spark</a>
                                    <div>1. combineByKey函数的运行机制 
  
RDD提供了很多针对元素类型为(K,V)的API,这些API封装在PairRDDFunctions类中,通过Scala隐式转换使用。这些API实现上是借助于combineByKey实现的。combineByKey函数本身也是RDD开放给Spark开发人员使用的API之一 
  
首先看一下combineByKey的方法说明:</div>
                                </li>
                                <li><a href="/article/314.htm"
                                       title="msyql设置密码报错:ERROR 1372 (HY000): 解决方法详解" target="_blank">msyql设置密码报错:ERROR 1372 (HY000): 解决方法详解</a>
                                    <span class="text-muted">daizj</span>
<a class="tag" taget="_blank" href="/search/mysql/1.htm">mysql</a><a class="tag" taget="_blank" href="/search/%E8%AE%BE%E7%BD%AE%E5%AF%86%E7%A0%81/1.htm">设置密码</a>
                                    <div>MySql给用户设置权限同时指定访问密码时,会提示如下错误: 
ERROR 1372 (HY000): Password hash should be a 41-digit hexadecimal number; 
  
问题原因:你输入的密码是明文。不允许这么输入。 
  
解决办法:用select password('你想输入的密码');查询出你的密码对应的字符串, 
然后</div>
                                </li>
                                <li><a href="/article/441.htm"
                                       title="路漫漫其修远兮 吾将上下而求索" target="_blank">路漫漫其修远兮 吾将上下而求索</a>
                                    <span class="text-muted">周凡杨</span>
<a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0+%E6%80%9D%E7%B4%A2/1.htm">学习 思索</a>
                                    <div>王国维在他的《人间词话》中曾经概括了为学的三种境界古今之成大事业、大学问者,罔不经过三种之境界。“昨夜西风凋碧树。独上高楼,望尽天涯路。”此第一境界也。“衣带渐宽终不悔,为伊消得人憔悴。”此第二境界也。“众里寻他千百度,蓦然回首,那人却在灯火阑珊处。”此第三境界也。学习技术,这也是你必须经历的三种境界。第一层境界是说,学习的路是漫漫的,你必须做好充分的思想准备,如果半途而废还不如不要开始。这里,注</div>
                                </li>
                                <li><a href="/article/568.htm"
                                       title="Hadoop(二)对话单的操作" target="_blank">Hadoop(二)对话单的操作</a>
                                    <span class="text-muted">朱辉辉33</span>
<a class="tag" taget="_blank" href="/search/hadoop/1.htm">hadoop</a>
                                    <div>Debug: 
 
1、 
 
A = LOAD '/user/hue/task.txt' USING PigStorage(' ') 
AS (col1,col2,col3); 
DUMP A; 
 
//输出结果前几行示例: 
(>ggsnPDPRecord(21),,) 
(-->recordType(0),,) 
(-->networkInitiation(1),,) 
</div>
                                </li>
                                <li><a href="/article/695.htm"
                                       title="web报表工具FineReport常用函数的用法总结(日期和时间函数)" target="_blank">web报表工具FineReport常用函数的用法总结(日期和时间函数)</a>
                                    <span class="text-muted">老A不折腾</span>
<a class="tag" taget="_blank" href="/search/finereport/1.htm">finereport</a><a class="tag" taget="_blank" href="/search/%E6%8A%A5%E8%A1%A8%E5%B7%A5%E5%85%B7/1.htm">报表工具</a><a class="tag" taget="_blank" href="/search/web%E5%BC%80%E5%8F%91/1.htm">web开发</a>
                                    <div>web报表工具FineReport常用函数的用法总结(日期和时间函数) 
  
说明:凡函数中以日期作为参数因子的,其中日期的形式都必须是yy/mm/dd。而且必须用英文环境下双引号(" ")引用。 
  
DATE 
DATE(year,month,day):返回一个表示某一特定日期的系列数。 
Year:代表年,可为一到四位数。 
Month:代表月份。</div>
                                </li>
                                <li><a href="/article/822.htm"
                                       title="c++ 宏定义中的##操作符" target="_blank">c++ 宏定义中的##操作符</a>
                                    <span class="text-muted">墙头上一根草</span>
<a class="tag" taget="_blank" href="/search/C%2B%2B/1.htm">C++</a>
                                    <div>#与##在宏定义中的--宏展开 #include <stdio.h> #define f(a,b) a##b #define g(a)   #a #define h(a) g(a) int main() {       &nbs</div>
                                </li>
                                <li><a href="/article/949.htm"
                                       title="分析Spring源代码之,DI的实现" target="_blank">分析Spring源代码之,DI的实现</a>
                                    <span class="text-muted">aijuans</span>
<a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/DI/1.htm">DI</a><a class="tag" taget="_blank" href="/search/%E7%8E%B0/1.htm">现</a><a class="tag" taget="_blank" href="/search/%E6%BA%90%E4%BB%A3%E7%A0%81/1.htm">源代码</a>
                                    <div>(转) 
   
分析Spring源代码之,DI的实现  
2012/1/3 by tony 
                接着上次的讲,以下这个sample    
[java]  
view plain 
copy 
print 
</div>
                                </li>
                                <li><a href="/article/1076.htm"
                                       title="for循环的进化" target="_blank">for循环的进化</a>
                                    <span class="text-muted">alxw4616</span>
<a class="tag" taget="_blank" href="/search/JavaScript/1.htm">JavaScript</a>
                                    <div>// for循环的进化
// 菜鸟
for (var i = 0; i < Things.length ; i++) {
	// Things[i]
}

// 老鸟
for (var i = 0, len = Things.length; i < len; i++) {
	// Things[i]
}

// 大师
for (var i = Things.le</div>
                                </li>
                                <li><a href="/article/1203.htm"
                                       title="网络编程Socket和ServerSocket简单的使用" target="_blank">网络编程Socket和ServerSocket简单的使用</a>
                                    <span class="text-muted">百合不是茶</span>
<a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%BB%9C%E7%BC%96%E7%A8%8B%E5%9F%BA%E7%A1%80/1.htm">网络编程基础</a><a class="tag" taget="_blank" href="/search/IP%E5%9C%B0%E5%9D%80%E7%AB%AF%E5%8F%A3/1.htm">IP地址端口</a>
                                    <div>  
网络编程;TCP/IP协议 
  
网络:实现计算机之间的信息共享,数据资源的交换 
  
协议:数据交换需要遵守的一种协议,按照约定的数据格式等写出去 
  
端口:用于计算机之间的通信 
     每运行一个程序,系统会分配一个编号给该程序,作为和外界交换数据的唯一标识 
0~65535 
  
查看被使用的</div>
                                </li>
                                <li><a href="/article/1330.htm"
                                       title="JDK1.5 生产消费者" target="_blank">JDK1.5 生产消费者</a>
                                    <span class="text-muted">bijian1013</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/thread/1.htm">thread</a><a class="tag" taget="_blank" href="/search/%E7%94%9F%E4%BA%A7%E6%B6%88%E8%B4%B9%E8%80%85/1.htm">生产消费者</a><a class="tag" taget="_blank" href="/search/java%E5%A4%9A%E7%BA%BF%E7%A8%8B/1.htm">java多线程</a>
                                    <div>ArrayBlockingQueue: 
       一个由数组支持的有界阻塞队列。此队列按 FIFO(先进先出)原则对元素进行排序。队列的头部 是在队列中存在时间最长的元素。队列的尾部 是在队列中存在时间最短的元素。新元素插入到队列的尾部,队列检索操作则是从队列头部开始获得元素。 
ArrayBlockingQueue的常用方法: 
</div>
                                </li>
                                <li><a href="/article/1457.htm"
                                       title="JAVA版身份证获取性别、出生日期及年龄" target="_blank">JAVA版身份证获取性别、出生日期及年龄</a>
                                    <span class="text-muted">bijian1013</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E6%80%A7%E5%88%AB/1.htm">性别</a><a class="tag" taget="_blank" href="/search/%E5%87%BA%E7%94%9F%E6%97%A5%E6%9C%9F/1.htm">出生日期</a><a class="tag" taget="_blank" href="/search/%E5%B9%B4%E9%BE%84/1.htm">年龄</a>
                                    <div>        工作中需要根据身份证获取性别、出生日期及年龄,且要还要支持15位长度的身份证号码,网上搜索了一下,经过测试好像多少存在点问题,干脆自已写一个。 
CertificateNo.java 
package com.bijian.study;

import java.util.Calendar;
import </div>
                                </li>
                                <li><a href="/article/1584.htm"
                                       title="【Java范型六】范型与枚举" target="_blank">【Java范型六】范型与枚举</a>
                                    <span class="text-muted">bit1129</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a>
                                    <div>首先,枚举类型的定义不能带有类型参数,所以,不能把枚举类型定义为范型枚举类,例如下面的枚举类定义是有编译错的 
  
public enum EnumGenerics<T> { //编译错,提示枚举不能带有范型参数
    OK, ERROR;
    public <T> T get(T type) {
        return null;
    </div>
                                </li>
                                <li><a href="/article/1711.htm"
                                       title="【Nginx五】Nginx常用日志格式含义" target="_blank">【Nginx五】Nginx常用日志格式含义</a>
                                    <span class="text-muted">bit1129</span>
<a class="tag" taget="_blank" href="/search/nginx/1.htm">nginx</a>
                                    <div>1. log_format 
1.1 log_format指令用于指定日志的格式,格式: 
  
log_format name(格式名称) type(格式样式) 
  
1.2 如下是一个常用的Nginx日志格式: 
  
log_format      main    '[$time_local]|$request_time|$status|$body_bytes</div>
                                </li>
                                <li><a href="/article/1838.htm"
                                       title="Lua 语言 15 分钟快速入门" target="_blank">Lua 语言 15 分钟快速入门</a>
                                    <span class="text-muted">ronin47</span>
<a class="tag" taget="_blank" href="/search/lua+%E5%9F%BA%E7%A1%80/1.htm">lua 基础</a>
                                    <div>-
- 
单行注释   
-
-
[[   
    
[多行注释]   
-
-
]]       
-
-
-
-
-
-
-
-
-
-   
- 
1. 
变量 & 控制流   
-
-
-
-
-
-
-
-
-
-   
num 
= 
23 
-
- 
数字都是双精度   
str 
= 
'aspythonstring' 
</div>
                                </li>
                                <li><a href="/article/1965.htm"
                                       title="java-35.求一个矩阵中最大的二维矩阵 ( 元素和最大 )" target="_blank">java-35.求一个矩阵中最大的二维矩阵 ( 元素和最大 )</a>
                                    <span class="text-muted">bylijinnan</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a>
                                    <div>the idea is from: 
http://blog.csdn.net/zhanxinhang/article/details/6731134 
 


public class MaxSubMatrix {

	/**see http://blog.csdn.net/zhanxinhang/article/details/6731134
	 * Q35
求一个矩阵中最大的二维</div>
                                </li>
                                <li><a href="/article/2092.htm"
                                       title="mongoDB文档型数据库特点" target="_blank">mongoDB文档型数据库特点</a>
                                    <span class="text-muted">开窍的石头</span>
<a class="tag" taget="_blank" href="/search/mongoDB%E6%96%87%E6%A1%A3%E5%9E%8B%E6%95%B0%E6%8D%AE%E5%BA%93%E7%89%B9%E7%82%B9/1.htm">mongoDB文档型数据库特点</a>
                                    <div>MongoDD: 文档型数据库存储的是Bson文档-->json的二进制 
 
特点:内部是执行引擎是js解释器,把文档转成Bson结构,在查询时转换成js对象。 
 
mongoDB传统型数据库对比 
   传统类型数据库:结构化数据,定好了表结构后每一个内容符合表结构的。也就是说每一行每一列的数据都是一样的 
   文档型数据库:不用定好数据结构,</div>
                                </li>
                                <li><a href="/article/2219.htm"
                                       title="[毕业季节]欢迎广大毕业生加入JAVA程序员的行列" target="_blank">[毕业季节]欢迎广大毕业生加入JAVA程序员的行列</a>
                                    <span class="text-muted">comsci</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a>
                                    <div> 
    一年一度的毕业季来临了。。。。。。。。 
 
     正在投简历的学弟学妹们。。。如果觉得学校推荐的单位和公司不适合自己的兴趣和专业,可以考虑来我们软件行业,做一名职业程序员。。。 
 
     软件行业的开发工具中,对初学者最友好的就是JAVA语言了,网络上不仅仅有大量的</div>
                                </li>
                                <li><a href="/article/2346.htm"
                                       title="PHP操作Excel – PHPExcel 基本用法详解" target="_blank">PHP操作Excel – PHPExcel 基本用法详解</a>
                                    <span class="text-muted">cuiyadll</span>
<a class="tag" taget="_blank" href="/search/PHP/1.htm">PHP</a><a class="tag" taget="_blank" href="/search/Excel/1.htm">Excel</a>
                                    <div>导出excel属性设置//Include classrequire_once('Classes/PHPExcel.php');require_once('Classes/PHPExcel/Writer/Excel2007.php');$objPHPExcel = new PHPExcel();//Set properties 设置文件属性$objPHPExcel->getProperties</div>
                                </li>
                                <li><a href="/article/2473.htm"
                                       title="IBM Webshpere MQ Client User Issue (MCAUSER)" target="_blank">IBM Webshpere MQ Client User Issue (MCAUSER)</a>
                                    <span class="text-muted">darrenzhu</span>
<a class="tag" taget="_blank" href="/search/IBM/1.htm">IBM</a><a class="tag" taget="_blank" href="/search/jms/1.htm">jms</a><a class="tag" taget="_blank" href="/search/user/1.htm">user</a><a class="tag" taget="_blank" href="/search/MQ/1.htm">MQ</a><a class="tag" taget="_blank" href="/search/MCAUSER/1.htm">MCAUSER</a>
                                    <div>IBM MQ JMS Client去连接远端MQ Server的时候,需要提供User和Password吗? 
答案是根据情况而定,取决于所定义的Channel里面的属性Message channel agent user identifier (MCAUSER)的设置。 
 
 
http://stackoverflow.com/questions/20209429/how-mca-user-i</div>
                                </li>
                                <li><a href="/article/2600.htm"
                                       title="网线的接法" target="_blank">网线的接法</a>
                                    <span class="text-muted">dcj3sjt126com</span>

                                    <div>一、PC连HUB (直连线)A端:(标准568B):白橙,橙,白绿,蓝,白蓝,绿,白棕,棕。 B端:(标准568B):白橙,橙,白绿,蓝,白蓝,绿,白棕,棕。 二、PC连PC (交叉线)A端:(568A): 白绿,绿,白橙,蓝,白蓝,橙,白棕,棕; B端:(标准568B):白橙,橙,白绿,蓝,白蓝,绿,白棕,棕。 三、HUB连HUB&nb</div>
                                </li>
                                <li><a href="/article/2727.htm"
                                       title="Vimium插件让键盘党像操作Vim一样操作Chrome" target="_blank">Vimium插件让键盘党像操作Vim一样操作Chrome</a>
                                    <span class="text-muted">dcj3sjt126com</span>
<a class="tag" taget="_blank" href="/search/chrome/1.htm">chrome</a><a class="tag" taget="_blank" href="/search/vim/1.htm">vim</a>
                                    <div>什么是键盘党? 
 
 键盘党是指尽可能将所有电脑操作用键盘来完成,而不去动鼠标的人。鼠标应该说是新手们的最爱,很直观,指哪点哪,很听话!不过常常使用电脑的人,如果一直使用鼠标的话,手会发酸,因为操作鼠标的时候,手臂不是在一个自然的状态,臂肌会处于绷紧状态。而使用键盘则双手是放松状态,只有手指在动。而且尽量少的从鼠标移动到键盘来回操作,也省不少事。 
 在chrome里安装 vimium 插件 
</div>
                                </li>
                                <li><a href="/article/2854.htm"
                                       title="MongoDB查询(2)——数组查询[六]" target="_blank">MongoDB查询(2)——数组查询[六]</a>
                                    <span class="text-muted">eksliang</span>
<a class="tag" taget="_blank" href="/search/mongodb/1.htm">mongodb</a><a class="tag" taget="_blank" href="/search/MongoDB%E6%9F%A5%E8%AF%A2%E6%95%B0%E7%BB%84/1.htm">MongoDB查询数组</a>
                                    <div>MongoDB查询数组 
转载请出自出处:http://eksliang.iteye.com/blog/2177292 一、概述 
 MongoDB查询数组与查询标量值是一样的,例如,有一个水果列表,如下所示: 
> db.food.find()
{ "_id" : "001", "fruits" : [ "苹</div>
                                </li>
                                <li><a href="/article/2981.htm"
                                       title="cordova读写文件(1)" target="_blank">cordova读写文件(1)</a>
                                    <span class="text-muted">gundumw100</span>
<a class="tag" taget="_blank" href="/search/JavaScript/1.htm">JavaScript</a><a class="tag" taget="_blank" href="/search/Cordova/1.htm">Cordova</a>
                                    <div>使用cordova可以很方便的在手机sdcard中读写文件。 
 
首先需要安装cordova插件:file 
命令为: 
 
cordova plugin add org.apache.cordova.file 
 
然后就可以读写文件了,这里我先是写入一个文件,具体的JS代码为: 
 


var datas=null;//datas need write
var directory=&</div>
                                </li>
                                <li><a href="/article/3108.htm"
                                       title="HTML5 FormData 进行文件jquery ajax 上传 到又拍云" target="_blank">HTML5 FormData 进行文件jquery ajax 上传 到又拍云</a>
                                    <span class="text-muted">ileson</span>
<a class="tag" taget="_blank" href="/search/jquery/1.htm">jquery</a><a class="tag" taget="_blank" href="/search/Ajax/1.htm">Ajax</a><a class="tag" taget="_blank" href="/search/html5/1.htm">html5</a><a class="tag" taget="_blank" href="/search/FormData/1.htm">FormData</a>
                                    <div>html5 新东西:FormData  可以提交二进制数据。 
 
 
页面test.html 
 

<!DOCTYPE>
<html>
<head>
<title> formdata file jquery ajax upload</title>
</head>

<body>
<</div>
                                </li>
                                <li><a href="/article/3235.htm"
                                       title="swift appearanceWhenContainedIn:(version1.2 xcode6.4)" target="_blank">swift appearanceWhenContainedIn:(version1.2 xcode6.4)</a>
                                    <span class="text-muted">啸笑天</span>
<a class="tag" taget="_blank" href="/search/version/1.htm">version</a>
                                    <div>  
swift1.2中没有oc中对应的方法: 
+ (instancetype)appearanceWhenContainedIn:(Class <UIAppearanceContainer>)ContainerClass, ... NS_REQUIRES_NIL_TERMINATION; 
 解决方法: 
在swift项目中新建oc类如下: 
#import &</div>
                                </li>
                                <li><a href="/article/3362.htm"
                                       title="java实现SMTP邮件服务器" target="_blank">java实现SMTP邮件服务器</a>
                                    <span class="text-muted">macroli</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E7%BC%96%E7%A8%8B/1.htm">编程</a>
                                    <div>电子邮件传递可以由多种协议来实现。目前,在Internet 网上最流行的三种电子邮件协议是SMTP、POP3 和 IMAP,下面分别简单介绍。 
  ◆ SMTP 协议 
  简单邮件传输协议(Simple Mail Transfer Protocol,SMTP)是一个运行在TCP/IP之上的协议,用它发送和接收电子邮件。SMTP 服务器在默认端口25上监听。SMTP客户使用一组简单的、基于文本的</div>
                                </li>
                                <li><a href="/article/3489.htm"
                                       title="mongodb group by having where 查询sql" target="_blank">mongodb group by having where 查询sql</a>
                                    <span class="text-muted">qiaolevip</span>
<a class="tag" taget="_blank" href="/search/%E6%AF%8F%E5%A4%A9%E8%BF%9B%E6%AD%A5%E4%B8%80%E7%82%B9%E7%82%B9/1.htm">每天进步一点点</a><a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0%E6%B0%B8%E6%97%A0%E6%AD%A2%E5%A2%83/1.htm">学习永无止境</a><a class="tag" taget="_blank" href="/search/mongo/1.htm">mongo</a><a class="tag" taget="_blank" href="/search/%E7%BA%B5%E8%A7%82%E5%8D%83%E8%B1%A1/1.htm">纵观千象</a>
                                    <div>SELECT cust_id,
       SUM(price) as total
FROM orders
WHERE status = 'A'
GROUP BY cust_id
HAVING total > 250

db.orders.aggregate( [
   { $match: { status: 'A' } },
   {
     $group: {
</div>
                                </li>
                                <li><a href="/article/3616.htm"
                                       title="Struts2 Pojo(六)" target="_blank">Struts2 Pojo(六)</a>
                                    <span class="text-muted">Luob.</span>
<a class="tag" taget="_blank" href="/search/POJO/1.htm">POJO</a><a class="tag" taget="_blank" href="/search/strust2/1.htm">strust2</a>
                                    <div>注意:附件中有完整案例 
1.采用POJO对象的方法进行赋值和传值 
2.web配置 
 

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" 
	xmlns="http://java.sun.com/xml/ns/javaee&q</div>
                                </li>
                                <li><a href="/article/3743.htm"
                                       title="struts2步骤" target="_blank">struts2步骤</a>
                                    <span class="text-muted">wuai</span>
<a class="tag" taget="_blank" href="/search/struts/1.htm">struts</a>
                                    <div>1、添加jar包 
2、在web.xml中配置过滤器 
 <filter> 
       <filter-name>struts2</filter-name> 
       <filter-class>org.apache.st</div>
                                </li>
                </ul>
            </div>
        </div>
    </div>

<div>
    <div class="container">
        <div class="indexes">
            <strong>按字母分类:</strong>
            <a href="/tags/A/1.htm" target="_blank">A</a><a href="/tags/B/1.htm" target="_blank">B</a><a href="/tags/C/1.htm" target="_blank">C</a><a
                href="/tags/D/1.htm" target="_blank">D</a><a href="/tags/E/1.htm" target="_blank">E</a><a href="/tags/F/1.htm" target="_blank">F</a><a
                href="/tags/G/1.htm" target="_blank">G</a><a href="/tags/H/1.htm" target="_blank">H</a><a href="/tags/I/1.htm" target="_blank">I</a><a
                href="/tags/J/1.htm" target="_blank">J</a><a href="/tags/K/1.htm" target="_blank">K</a><a href="/tags/L/1.htm" target="_blank">L</a><a
                href="/tags/M/1.htm" target="_blank">M</a><a href="/tags/N/1.htm" target="_blank">N</a><a href="/tags/O/1.htm" target="_blank">O</a><a
                href="/tags/P/1.htm" target="_blank">P</a><a href="/tags/Q/1.htm" target="_blank">Q</a><a href="/tags/R/1.htm" target="_blank">R</a><a
                href="/tags/S/1.htm" target="_blank">S</a><a href="/tags/T/1.htm" target="_blank">T</a><a href="/tags/U/1.htm" target="_blank">U</a><a
                href="/tags/V/1.htm" target="_blank">V</a><a href="/tags/W/1.htm" target="_blank">W</a><a href="/tags/X/1.htm" target="_blank">X</a><a
                href="/tags/Y/1.htm" target="_blank">Y</a><a href="/tags/Z/1.htm" target="_blank">Z</a><a href="/tags/0/1.htm" target="_blank">其他</a>
        </div>
    </div>
</div>
<footer id="footer" class="mb30 mt30">
    <div class="container">
        <div class="footBglm">
            <a target="_blank" href="/">首页</a> -
            <a target="_blank" href="/custom/about.htm">关于我们</a> -
            <a target="_blank" href="/search/Java/1.htm">站内搜索</a> -
            <a target="_blank" href="/sitemap.txt">Sitemap</a> -
            <a target="_blank" href="/custom/delete.htm">侵权投诉</a>
        </div>
        <div class="copyright">版权所有 IT知识库 CopyRight © 2000-2050 E-COM-NET.COM , All Rights Reserved.
<!--            <a href="https://beian.miit.gov.cn/" rel="nofollow" target="_blank">京ICP备09083238号</a><br>-->
        </div>
    </div>
</footer>
<!-- 代码高亮 -->
<script type="text/javascript" src="/static/syntaxhighlighter/scripts/shCore.js"></script>
<script type="text/javascript" src="/static/syntaxhighlighter/scripts/shLegacy.js"></script>
<script type="text/javascript" src="/static/syntaxhighlighter/scripts/shAutoloader.js"></script>
<link type="text/css" rel="stylesheet" href="/static/syntaxhighlighter/styles/shCoreDefault.css"/>
<script type="text/javascript" src="/static/syntaxhighlighter/src/my_start_1.js"></script>





</body>

</html>