In any game where you have character leveling, you need to decide on a power curve.
This is a mathematical function which maps game progress to character strength. This curve can be linear, polynomial or even exponential. The flatter the curve, the less progress your player will feel, but the easier it is to balance because early-game content still stays relevant until the late-game.
Design your content in a way that while the player progresses through your game, you hand out powerups in a way that their characters power stays on that curve. Simultaneously you increase the power level of any opponents and other challenges the player faces to be around that power curve. At the beginning of the game, where the player is still learning your game mechanics, you want them to be below the curve. But in the end, when the player has mastered your mechanics, you want them to be above the curve to provide a challenge. How far below or above the curve depends on how hard it is to learn your game mechanics and how much power potential they have when mastered.
That means there can be an awesome powerup around the next corner, but only when you make sure that all future enemy encounters are even stronger to compensate for the increased power of the player-character.
Let's say your game has 10 levels, and you decided on a polynomial power curve which is
10 * (level ^ 1.2). This means you would hand out powerups in each level so that the player ends up with approximately this amount of attack on each level:
A spreadsheet application like Excel is very useful for calculating such tables.
This table also tells you how many hit points the enemies on each level should have, which would be a multiple of these values (the value of that multiplier depends on how many hits on average you want an enemy to take before they go down). Again, stay slightly below that curve on earlier levels and slightly above on later levels when you design enemy encounters.
"But what if I want my game to be a fluent experience not separated into levels?" - then still separate it into levels, just don't tell the player where one level ends and another level begins.
"But what if my game is an open world game and I want to let the player explore it in any order they like?" - then either have the player progress very little, have them progress horizontally (give them new abilities which open up alternative strategies but aren't actually more powerful), or make sure that when the player gets stronger, the whole world adapts and becomes more challenging.