A few protocol parameters' sole purpose is to prevent over-centralization of stake. These include:
k (or nOpt) - a.k.a. the pool saturation limit. This disincentivizes over-delegation to any one pool by lowering total pool rewards after a high enough delegation. This limit is calculated by (Total circulating supply / k ), per pool. Increasing k thus encourages stake distribution across more pools. However, when this happens pool operators may "split" their pool into multiple pools. To combat this, we have the following parameter:
a0 - a.k.a. the pledge influence factor. This parameter dictates the effect an operator's pledge has on their pool's rewards (higher pledge = higher rewards). Currently, there is a linear relationship between pledge and pool rewards, but CIP-7 will soon change this to an n-curve to compensate for the unnecessary advantage it gives to pools with very high pledge (>5M).
Community and Active Participation
Apart from first-order incentive structures as outlined above, decentralization is also encouraged throughout the community at a pedagogical level. A combination of great documentation, peer-to-peer style learning, and a shared vision creates a kind of communal "ethos", in which decentralization is a high priority. For example, here is a great blog post by IOG's Chief Scientist Aggelos Kiayias outlining what all participants can do to help maintain healthy decentralization.
Additionally, there are many sub-communities within Cardano building on and addressing different problems, decentralization being one of them. For example, the Cardano Single Pool Alliance is a loose cohort of single SPO's who've committed to operating no more than one stake pool on the network. There is also the Cardano Bare Metal Alliance; SPO's committed to running their nodes on their own hardware (as opposed to cloud infrastructure) to prevent too much of the network from aggregating in large data centers.
Ultimately, it is education and awareness that goes furthest in promoting decentralization, because decentralization itself is much deeper topic than simply the distribution of block production. I expand on this further in this post.